Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.10.2017, 20:34   #1
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию Groovy & Swing

Пишу игрушку puzzle - два вопроса в тексте ...
Код:

//puzzle.groovy
package groovy
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.FlowLayout
import java.util.*
import java.awt.*
import java.awt.event.*

jfrm = new JFrame('N-размерный puzzle')
gbag = new GridBagLayout()
gbc  = new GridBagConstraints()
jfrm.getContentPane().setLayout(gbag)
jfrm.setSize(500, 500)
btnDim  = new Dimension(50, 50)
gbc.weightx = 0.0       
gbc.insets  = new Insets(0, 0, 0, 0)

public class Spisok_2 {def spisok_2 (N) { Spisok m1 = new Spisok(); def   order1 = m1.spisok(N); return order1}}
                       def spisok (N) { m2 = new Spisok_2();  order1 = m2.spisok_2(N)}
H = "X"                       
N = 5
chisla = spisok(N)
dl = chisla.size()
def naprav () {q = 3; w = 3; [q, w]}
for (int I = 0; I < dl; I++) {
  Y = (int)(I/N); X = I%N  
  jbtnCh = new JButton(text: chisla[I],  actionPerformed: {jbtnCh.setText(H)})
//Как сделать так, чтобы при нажатии на любой кнопке, имено она именовалась "X",
//а не последняя, как происходит сейчас?...
  //jbtnCh = new JButton(text: chisla[I],  actionPerformed: {def (X, Y) = naprav()})
//Как сделать так, чтобы при нажатии на любой кнопке, значения X и Y из JButton(...)
//передавались в gbc.gridy = Y; gbc.gridx = X
  gbc.gridy = Y; gbc.gridx = X 
  jbtnCh.setPreferredSize(btnDim)   
  gbag.setConstraints(jbtnCh, gbc)
  jfrm.getContentPane().add(jbtnCh) 
   }
jfrm.setVisible(true)

Код:

//Spisok.groovy
package groovy
  public class Spisok {
    Integer S, J, T, Q
    List order, order1
    def spisok (N) {
    S = (N as Integer  )** 2 - 1
    order = [0]; Q = 0
  while (Q <= S) {
     J = 0; T = Math.round(Math.random() * S)
    if (T != 0) {for (i in order) {if (T != i) {++J} }
      if (J == order.size()) {order = order + T}
         }
       Q = order.size()
      }
    order1 = order - 0 + ""
   }
}

leprekod вне форума   Ответить с цитированием
Старый 19.10.2017, 02:23   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 890
Репутация: 627
По умолчанию

1)
Код:

actionPerformed: {e -> e.getSource().setText(H)}

2) Не понял вопрос, честно говоря..
Black Fregat вне форума   Ответить с цитированием
Старый 19.10.2017, 14:17   #3
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию

1. Black Fregat, спасибо за совет - всё работает как мне надо!
2.
Код:

def naprav () {q = 3; w = 3; [q, w]}
jbtnCh = new JButton(text: chisla[I],  actionPerformed: {def (X, Y) = naprav()})
//Как сделать так, чтобы при нажатии на любой кнопке, значения X и Y из JButton(...)
//передавались в gbc.gridy = Y; gbc.gridx = X
  gbc.gridy = Y; gbc.gridx = X

При нажатии на кнопку происходит срабатывание выражения в actionPerformed
(X присваивается значение 3, Y тоже ...), но далее, "в программу", эти значения
не идут - gbc.gridy не присваивается 3, gbc.gridx тоже ...
Как надо изменить код, чтобы значения присваивались!
leprekod вне форума   Ответить с цитированием
Старый 19.10.2017, 14:49   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 890
Репутация: 627
По умолчанию

Расскажите чуть подробнее, как Вы всё это мыслите.
Вот создали Вы 16 кнопок. На каждой из них по первому пункту повесили смену заголовка на X. А вот чего Вы хотите от них дальше - не понимаю..
Black Fregat вне форума   Ответить с цитированием
Старый 19.10.2017, 18:26   #5
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию

Black Fregat, я просто "ищу подступы" к следующему - при нажатии любой кнопки должен срабатывать метод который определяет есть ли рядом "пустая" кнопка - "", и с какой стороны она находится, и если это так, то эта кнопка меняется с кнопкой "" местами ...
И вот значения q и w присваиваются X и Y в jbtnCh, а из неё "информация не идет", gbc.gridy не присваивается значение Y; gbc.gridx значение X ...
P.S. Моя конечная цель сделать так, чтобы можно было задавать размерность puzzle (от 3 до 10 включительно), а так же чтобы расположение номеров кнопок каждый раз было случайным - без 0, без повторов, без лакун. Метод spisok делает такой список.
leprekod вне форума   Ответить с цитированием
Старый 19.10.2017, 20:23   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 890
Репутация: 627
По умолчанию

Цитата:
Сообщение от leprekod Посмотреть сообщение
И вот значения q и w присваиваются X и Y в jbtnCh, а из неё "информация не идет", gbc.gridy не присваивается значение Y; gbc.gridx значение X ...
Эта фраза, извините, говорит о том, что у Вас в голове изрядная путаница..
Даже не знаю, с какого конца в ней подступаться..

Цикл проходит по числам от 0 до 16, на каждом шаге создаёт JButton, вычисляет X и Y, заносит их в gbc и по нему добавляет созданный JButton в GridBagLayout. Это всё работает, иначе Вы не увидели квадратика из кнопочек. Но эти X и Y никак не сохраняются в самой JButton!

Если какую-то информацию нужно связать с JButton, то чаще всего её кодируют в свойство ActionCommand. Как вариант, там кодируют индекс структуры с информацией, которая хранится в некотором дополнительном контейнере.

А теперь пару слов о том, как всё это работает. Весь этот код - только инициализация. В момент появления формы на экране он уже закончил работу.
А работать дальше будут только обработчики событий, именно те кусочки, которые прописаны в actionPerformed: И работать они будут сами по себе, замкнуто, а не в том месте, где они у Вас написаны. Но именно в них предстоит реализовывать логику работы. Их нужно будет увеличивать в объёме, выносить в отдельные методы.

Мой Вам совет - не спешите набивать шишки, поищите готовые решения, поймите, как они работают. Событийно-управляемый интерфейс требует определённого понимания принципов работы перед тем, как писать код.
Black Fregat вне форума   Ответить с цитированием
Старый 20.10.2017, 00:09   #7
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию

Black Fregat, пожалуйста, можно по подробнее о e -> e.getSource().setText(H), или подскажите где можно прочесть об этом (желательно на русском) ...
leprekod вне форума   Ответить с цитированием
Старый 20.10.2017, 00:21   #8
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,179
Репутация: 3199

icq: 512-765
skype: alexp.frl
По умолчанию

Я не в курсе что там в свинге (выкиньте уже его и возьмите JavaFX, а еще лучше Kotlin + TornadoFX ), но скорее всего е это объект с данными события (например какого элемента событие и прочие данные в зависимости от события, например координаты клика или нажатая кнопка) и getSource возвращает элемент, который сгенерировал это событие. Ну и setText это уже его метод.

А -> это лямбда-функция если как в Java, но может быть в Groovy другой синтаксис? У вас вроде по-другому выше.

Последний раз редактировалось Alex11223; 20.10.2017 в 00:33.
Alex11223 на форуме   Ответить с цитированием
Старый 20.10.2017, 01:37   #9
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
У вас вроде по-другому выше
Ёды мастера речью заговорили Вы ...

Последний раз редактировалось leprekod; 20.10.2017 в 01:41.
leprekod вне форума   Ответить с цитированием
Старый 31.10.2017, 02:17   #10
leprekod
Пользователь
 
Регистрация: 18.12.2016
Сообщений: 35
Репутация: 10
По умолчанию

При N >= 10 кнопки с номерами от 1 до 9 зрительно по ширине занимают меньше
пространства чем остальные, т. е. по ширине размер компонента (кнопки) меньше чем
размер ячейки ...
Как надо исправить код, чтобы размеры всех кнопок совпадали с размерами ячеек ...
leprekod вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод/вывод в Groovy leprekod Общие вопросы по Java, Java SE, Kotlin 15 08.03.2017 10:09
Плагин для groovy Senatorik Общие вопросы по Java, Java SE, Kotlin 4 10.04.2016 01:14
GROOVY AlyonaM Помощь студентам 0 19.03.2014 10:30
Swing JLayer&&LayerUI mir_zol Общие вопросы по Java, Java SE, Kotlin 0 14.04.2013 20:00


14:02.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru