Java / Swing JButton не отображает свой текст и не выполняет свои действия - PullRequest
1 голос
/ 04 июня 2019

Я хочу написать простую систему светофоров. Я хочу сделать кнопку, которая запустит всю программу (открыть графический интерфейс системы светофора). Но уже моя первая кнопка начинает создавать проблемы. Он не отображает свой текст, и действие, которое он должен выполнить, не произойдет. Я действительно новичок, так что это, вероятно, какая-то глупая и очевидная ошибка, но, пожалуйста, взгляните, я был бы действительно счастлив ^^

package kreuzung;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;

public class HomeFrame extends JFrame{

    public HomeFrame(String title) {
        super(title);

    this.setLayout(new FlowLayout(FlowLayout.CENTER));

    Button test = new Button("noAction");


    Container cont = getContentPane();

    cont.add(test, BorderLayout.CENTER);



    }
}

И это будет сгенерированная кнопка, которая не выполняет то, что должна делать

package kreuzung;

import javax.swing.Action;
import javax.swing.JButton;

public class Button extends JButton{

    private String actionName;

    public Button(String actionName) {

        this.actionName = actionName;                       //set the Action name of this button                             

        JButton button = new JButton();                     //instantiate this Button
        button.setText(actionName);                         //set the Action Name as Button Text
        button.setSize(30, 30);             
        button.setBounds(5, 5, 25, 25);     




        button.addActionListener(new Evt(this.actionName));     //add an Action Listener to the button 
                                                            //and gets the Action from the Evt Class
    }

}

И последнее, но не менее важное, вот класс Evt, который должен позаботиться о выполнении действия

package kreuzung;
import java.awt.event.*;

import javax.swing.JFrame;

public class Evt implements ActionListener {

    private String actionName;

    public Evt(String actName) {

        this.actionName = actName;

    }



    @Override
    public void actionPerformed(ActionEvent e) {
        switch(actionName) {
        case "noAction":
            JFrame frame = new HomeFrame("Home");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 400);
            frame.setVisible(true);
            break;
        }
    }

}

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

В вашем коде есть несколько ошибок:

  1. Вы не должны расширять JFrame, смотрите Расширяет JFrame по сравнению с созданием его внутри программы
  2. Не звоните setBounds(...) Менеджеры по расположению позаботятся о расположении ваших компонентов
  3. Не оставляйте слишком много дополнительного пространства между строками или после / перед открытием / закрытием скобок {} становится трудно читать
  4. Не вызывайте Button как имя класса, его можно спутать с java.awt.Button class.

Он не отображает свой тексти действие, которое оно должно выполнить, не произойдет

В этом классе:

public class Button extends JButton {
    private String actionName;
    public Button(String actionName) {
        this.actionName = actionName;
        JButton button = new JButton();
        button.setText(actionName);
        button.setSize(30, 30);             
        button.setBounds(5, 5, 25, 25);     

        button.addActionListener(new Evt(this.actionName));
    }
}

Вы расширяетесь от JButton, а затем создаете JButton внутри него!Итак, у вас есть 2 JButtons, один из класса (унаследованный) и тот, который вы создаете внутри него.Но вы устанавливаете текст на тот, который создан внутри, но вы добавляете другой (без текста) к своему JFrame.

В метафоре это похоже на:

  • Вы пишете на странице что-то
  • Вы получаете новую белую страницу и добавляете ее в свою книгу вместо того, чтобы добавить ту, которую вы написали в своей книге.

Там нетнеобходимо расширить JButton в вашей текущей программе, поэтому просто создайте новый экземпляр JButton и все.

В противном случае, если вы действительно хотите использовать пользовательский класс JButton, сделайте это:

public class MyCustomButton extends JButton { // Change class name
    private String actionName;
    public MyCustomButton(String actionName) {
        super(actionName); //Sets the text
        this.actionName = actionName;

        button.addActionListener(new Evt(this.actionName));
    }
}
0 голосов
/ 04 июня 2019

Единственное, что вам действительно не хватает - это вызов setVisible (true) в вашем конструкторе HomeFrame. Это на самом деле метод, который запускает поток событий пользовательского интерфейса и отображает ваши компоненты. Однако вам, вероятно, следует также вызвать pack () , чтобы ваш кадр не отображался только с оформлением кадра. Код:

public class HomeFrame extends JFrame {

    public HomeFrame(String title) {
        super(title);
        this.setLayout(new FlowLayout(FlowLayout.CENTER));
        Button test = new Button("noAction");
        Container cont = getContentPane();
        cont.add(test, BorderLayout.CENTER);
        pack();            /* Optional */
        setVisible(true);  /* Critical */ 
    }
} 

Есть несколько способов модернизировать этот код пользовательского интерфейса, но это, по крайней мере, должно показать его.

0 голосов
/ 04 июня 2019

На самом деле вам не нужно создавать дочерний класс JButton, поскольку вы не добавляете в него какой-либо конкретный атрибут. Вместо этого вы должны быть в состоянии заставить его работать так:

public class HomeFrame extends JFrame{

    private static final String BUTTON_ACTION_NAME = "myActionName";

    public HomeFrame(String title) {
        super(title);

        this.setLayout(new FlowLayout(FlowLayout.CENTER));
        JButton test = new JButton();
        test.setText(BUTTON_ACTION_NAME);
        test.setSize(30, 30);             
        test.setBounds(5, 5, 25, 25);     
        test.addActionListener(new Evt(BUTTON_ACTION_NAME));
        Container cont = getContentPane();
        cont.add(test, BorderLayout.CENTER);
    }
}
...