JavaRush/Java блог/Архив info.javarush/Нужна помощь с Jframe. Пишем первую маленькую прогу
DenisJNewb
11 уровень

Нужна помощь с Jframe. Пишем первую маленькую прогу

Статья из группы Архив info.javarush
участников
Вот начал писать небольшую прогу для расчета бонусов. import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Interface { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Interface(); } }); } Interface() { //ОСНОВНОЕ ОКНО//////////////////////////////////////////////////// JFrame frame = new JFrame("Основное окно"); frame.setSize(240, 500); frame.setResizable(false); frame.setLocation(0/*(int) screenSize().getHeight() * 1/ 100*/, (int) screenSize().getWidth() * 25 / 100); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); //ПАНЕЛЬ JPanel jpn = new JPanel(); JLabel lbl = new JLabel("Первая прога"); jpn.add(lbl); //ПАНЕЛЬ 2 JPanel jpn2 = new JPanel(); JLabel lbl2 = new JLabel("Текущий бонус: "); JButton btn = new JButton("0"); jpn2.add(lbl2); jpn2.add(btn); //ДОБАВЛЕНИЕ ПАНЕЛЕЙ frame.add(jpn, BorderLayout.NORTH); frame.add(jpn2, BorderLayout.CENTER); //ОКНО БОНУСОВ////////////////////////////////////////////////////// JFrame secondFrame = new JFrame("Окно бонусов"); secondFrame.setSize(250, 300); secondFrame.setResizable(false); secondFrame.setLocationRelativeTo(null); secondFrame.setLayout(new BorderLayout()); secondFrame.setUndecorated(false); //ПАНЕЛЬ 1 JPanel jppF1 = new JPanel(new GridLayout(3, 2, 3, 5)); //ПАНЕЛЬ 2 JPanel jppF2 = new JPanel(new GridLayout(5, 2)); JLabel lblpF3 = new JLabel("Тип объекта"); jppF2.add(lblpF3); String[] getUnitNames = {"Тип1","Тип2","Тип3","Тип4","Тип5"}; JComboBox jcbpF = new JComboBox<>(getUnitNames); jppF2.add(jcbpF); JLabel lblpF4 = new JLabel("Количество"); jppF2.add(lblpF4); JTextField tfpF = new JTextField(15); jppF2.add(tfpF); jppF2.add(new JLabel()); JButton btnpF = new JButton("Добавить"); jppF2.add(btnpF); //ДОБАВЛЕНИЕ ПАНЕЛЕЙ secondFrame.add(jppF1, BorderLayout.NORTH); secondFrame.add(jppF2, BorderLayout.SOUTH); ///////////////К Н О П К И //////////////////////////////////////////// btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!secondFrame.isVisible()) { secondFrame.setVisible(true); } } }); btnpF.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JLabel lblpF1 = new JLabel(""); if (lblpF1.getText().equals(jcbpF.getSelectedItem())) { lblpF1.setText("asdasdas"); } else { jppF1.add(lblpF1); lblpF1.setText("" + jcbpF.getSelectedItem() + " (" + tfpF.getText() + ")"); new GroupLayout(jppF1); jppF1.setLayout(new GridLayout(3, 2, 3, 5)); } } }); /////////////////////////////////////////////////////////////////////// } private static Dimension screenSize() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); return screenSize; } private static Integer typeCost(HashMap map, String z) { int q = 0; Iterator> qqe = map.entrySet().iterator(); while (qqe.hasNext()) { Map.Entry para = qqe.next(); if (para.getKey().equals(z)) q = para.getValue(); } return q; } } Сейчас столкнулся с проблемой создания объектов во втором окне. Необходимо создать в верхней части объекты(можно метки, можно единую таблицу), данные из которых я смогу забирать. Сейчас при клике на кнопку "Добавить", мы создаём метку, и я не представляю как выдрать текст метки(например текст 2й метки, если после неё уже создал 3ю метку). В идеале: создать таблицу. Взять число из второй строки второго столбца и записать его в название кнопки. Прошу помочь начинающему java прогеру. Ну и в целом может это всё создаётся как то по другому?
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
DenisJNewb
Уровень 11
13 августа 2015, 07:54
Спасибо за Ваши комментарии, буду копать в сторону
По таблицам посмотри официальный туториал «How to Use Tables». Вот JTable API.
хоть в английском не силен, но попробую.
AndreGold
Уровень 28
12 августа 2015, 15:46
все просто, методы get() и set() Вам в помощь.
Точно так же как, методом set() Вы устанавливаете какое-либо значение, так же методом get() вы это значение у любого компонента можете брать.
Например,
JLabel label = new JLabel("Метка 1");
String str = label.getText(); // "Метка 1"
AndreGold
Уровень 28
12 августа 2015, 15:57
перечитал, Ваш вопрос раз 10, ничего толком не понял, обрывки фраз и мыслей.
Если Вам нужно построить таблицу, то «копать» Вам нужно в направлении TableModel.
И еще, метод
setVisible(true/false);

Должен идти после добавления всех компонентов, а то вы уже отобразили фрейм, а потом, только начинаете добавлять компоненты на фрейм.
DenisJNewb
Уровень 11
13 августа 2015, 07:57
с get и set я знаком, но:
Когда я создаю кнопкой новую метку, я не знаю как получить getText старой метки — вот мой вопрос.
Вообще я понял, что это лучше всего реализовать таблицей
blacky
Уровень 23
13 августа 2015, 08:15
Я же говорю — ты ссылку на старую метку нигде не хранишь. Если любишь трудности, тогда используй рефлекшн. А для теста сделай метку статической и сможешь ей пользоваться в любом месте приложения:
public static JLabel usefulLabel = new JLabel("Useful label");
// ... some code
        btnpF.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                usefulLabel.setText("You changed me!");
            }
        }

Либо создай производный SecondFrame класс от JFrame, добавь в него геттеры/сеттеры, чтобы получать метки/таблицы и изменять их.
По Swing очень-очень много материалов на родном — смотри статьи Skipy, habr, можно посмотреть книги Портянкина, Шилдта и др.
DenisJNewb
Уровень 11
13 августа 2015, 10:08
Возможно я что-то не понимаю, но описанный тобой способ подразумевает что я создам метку, потом получу её текст.
Дело в том, что там буду только нужные метки. Когда число рядом с меткой будет равно 0, метка будет удалена(Пока не реализовано в коде выше). Поэтому в голову приходит только создание всех типов объектов (более 20)и, как написал выше AndreGold, играться с setVisible.
Сейчас я остановился на идее создать таблицу и её уже редактировать по ходу дела. Сижу, изучаю твои ссылки на них.
blacky
Уровень 23
13 августа 2015, 10:59
Ну ок. После того как освоишь Swing советую глянуть «Data binding» в JavaFX или SWT/Jface.
blacky
Уровень 23
12 августа 2015, 13:54
Чтобы получить данные откуда-нибудь нужно иметь информацию об источнике, например, ссылку на объект.
У тебя же при обработке нажатия кнопки постоянно создается новая метка, а старые метки не удаляются из окна.
Ты можешь создать метку ранее, сделать её final, у тебя будет постоянная ссылка на объект, но при этом ты можешь менять текст этой метки.
По таблицам посмотри официальный туториал "How to Use Tables". Вот JTable API.
blacky
Уровень 23
12 августа 2015, 14:01
Вместо Interface лучше что-то типа BonusUI.
Ну и в целом может это всё создаётся как то по другому?
Просто сделай чтобы работало, а потом будешь думать о красоте кода и быстродействии.
DenisJNewb
Уровень 11
13 августа 2015, 07:55
Спасибо, учту.