Попытка установить макет в BoxLayout - PullRequest
0 голосов
/ 08 октября 2019

Кажется, я не могу найти решение онлайн, почему я получаю эту ошибку при попытке запуска

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

Обновление

Получил ошибку макета коробки, чтобы исчезнуть, но код не центрируетсяих на панели / раме. Метка и кнопка выравниваются по левому краю, а текстовое поле становится очень большим. Мне это не нужно, чтобы

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import static javax.swing.BoxLayout.Y_AXIS;
import static javax.swing.SwingConstants.CENTER;

public class button extends JFrame {
static JFrame f;
static JButton b;
static JLabel l;

// main class
public static void main(String[] args)
{
    // create a new frame to stor text field and button
    f = new JFrame("panel");
    BoxLayout layout = new BoxLayout(f, BoxLayout.Y_AXIS);
    f.setLayout(layout);

    // create a label to display text
    l = new JLabel("panel label");
    b = new JButton("button1");
    JTextField textArea = new JTextField(5);
    textArea.setEditable(false);
    //textArea.append("Hello World");


    // create a panel to add buttons
    JPanel p = new JPanel();

    // add buttons and textfield to panel
    f.add(p);
    f.setSize(300, 300);
    p.add(l);
    p.add(b);
    p.setBackground(Color.white);
    p.add(textArea);
    f.show();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    b.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {

            Random r = new Random();
            textArea.setText(String.valueOf(r));

        }
    });
}
}






Error
Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
at java.desktop/javax.swing.BoxLayout.checkContainer(BoxLayout.java:461)
at java.desktop/javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:245)
at java.desktop/javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:278)
at java.desktop/java.awt.Container.addImpl(Container.java:1152)
at java.desktop/java.awt.Container.add(Container.java:1029)
at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:553)
at java.desktop/java.awt.Container.add(Container.java:436)
at button.main(button.java:36)

Я бы хотел, чтобы все три элемента были сложены один над другим с пробелом между ними. Порядок не имеет значения прямо сейчас.

1 Ответ

3 голосов
/ 08 октября 2019

Swing был впервые добавлен в JDK в 1998 году и с тех пор претерпел множество изменений. К сожалению, когда вы читаете веб-страницы о Swing , неясно, когда эта страница последний раз обновлялась. Следовательно, вы можете изучать устаревшие методы написания Swing кода.

Прежде всего, согласно опубликованному коду, класс button не должен расширять класс JFrame, поскольку выиспользуйте статическую переменную в качестве JFrame вашего приложения. Кроме того, JFrame является контейнером верхнего уровня, что делает его контейнером особого вида, а не континуатором, аналогичным JPanel. Вам необходимо установить менеджер раскладки для JPanel, а затем добавить JLabel, JTextField и JButton к этому JPanel. А затем добавьте JPanel к JFrame.

. Метод вызова pack() класса JFrame автоматически установит предпочтительные размеры для компонентов внутри JFrame. Это показано в приведенном ниже коде.

Также обратите внимание на Соглашения о кодировании Java , которые позволяют другим пользователям легче читать и понимать ваш код. И обратите внимание, что в соответствии с этими соглашениями я переименовал ваш класс с button на Buttons, а также потому, что в JDK уже есть несколько классов с именем Button.

Вот мое переписывание вашего кода...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class Buttons implements Runnable {

    public void run() {
        createAndShowGui();
    }

    private void createAndShowGui() {
        JFrame f = new JFrame("Box");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel p = new JPanel();
        BoxLayout layout = new BoxLayout(p, BoxLayout.Y_AXIS);
        p.setLayout(layout);
        JLabel l = new JLabel("panel label");
        JTextField textField = new JTextField(5);
        JButton b = new JButton("button1");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random r = new Random();
                textField.setText(String.valueOf(r.nextBoolean()));
            }
        });
        p.add(l);
        p.add(textField);
        p.add(b);
        f.add(p);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        Buttons instance = new Buttons();
        EventQueue.invokeLater(instance);
    }
}
...