Изменение видимости этикетки - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в Java и немного поработаю с WindowBuilder. Я хочу изменить видимость различных компонентов, таких как метки или текстовые поля. Итак, я написал пример кода: функция, когда я нажимаю на кнопку btnAnzahl, логическое значение bNoteVis устанавливается равным true в методе uebernehmen, а bNoteVis используется в качестве переменной для изменения видимости ярлык lblNote. Когда я нажимаю на кнопку, в текстовом поле tfNote появляется сообщение True, но метка lblNote все еще не видна. Может кто-нибудь сказать мне, как я могу изменить видимость, как это, потому что я хочу изменить его со многими компонентами в нескольких событиях.

package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Notenbilanz_2 extends JFrame {

    private JPanel contentPane;
    private JTextField tfAnzahl;
    private JTextField tfNote;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Notenbilanz_2 frame = new Notenbilanz_2();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Notenbilanz_2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblAnzahl = new JLabel("Noten Anzahl");
        lblAnzahl.setBounds(10, 11, 87, 14);
        contentPane.add(lblAnzahl);

        tfAnzahl = new JTextField();
        tfAnzahl.setBounds(10, 31, 104, 20);
        contentPane.add(tfAnzahl);
        tfAnzahl.setColumns(10);

        JLabel lblNote = new JLabel("1.Note");
        lblNote.setVisible(bNoteVis);
        lblNote.setBounds(10, 68, 87, 16);
        contentPane.add(lblNote);

        tfNote = new JTextField();
        tfNote.setBounds(10, 95, 104, 20);
        contentPane.add(tfNote);
        tfNote.setColumns(10);

        JButton btnAnzahl = new JButton("Umrechnen");
        btnAnzahl.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                uebernehmen();
                if (bNoteVis) {
                    tfNote.setText("True");
                }
            }
        });
        btnAnzahl.setBounds(159, 28, 100, 26);
        contentPane.add(btnAnzahl);

        JButton btnNote = new JButton("Umrechnen");
        btnNote.setBounds(159, 92, 100, 26);
        contentPane.add(btnNote);
    }

    boolean bNoteVis = false;

    private void uebernehmen() {
        bNoteVis = true;
    }

}


1 Ответ

1 голос
/ 09 апреля 2020

У вас есть какое-то "волшебное" 1033 * мышление ". То есть:

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

Чтобы добиться успеха, вам необходимо изменить видимость самого компонента из слушателя. , Другими словами, в ActionListener , вам нужно будет позвонить .setVisible(true/false) по интересующему компоненту.

    btnAnzahl.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            uebernehmen();
            lblNote.setVisible(bNoteVis);
        }
    });

Другие не связанные с этим вопросы:

  • выполнение этого contentPane.setLayout(null);, и это lblNote.setBounds(10, 68, 87, 16); со временем приведет к значительному разочарованию, поскольку это приведет к негибкости GUI, которые могут выглядеть нормально на одной платформе, но не на других, и трудно расширять и модифицировать. Намного лучше изучать и использовать менеджеры компоновки
  • Если ваша цель состоит в изменении нескольких компонентов, то лучше всего поменять компонентов с помощью CardLayout. Посмотрите CardLayout Tutorial для получения подробной информации о том, как использовать этот инструмент.
  • Кроме того, вместо того, чтобы переключать видимость JLabel, я бы изменил его текст так, чтобы он все еще занимал место на GUI.

Например:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class Notenbilanz3 extends JPanel {
    private static final String LABEL_TEXT = "Noten Anzahl";
    private JLabel lblNote = new JLabel(LABEL_TEXT);
    private JTextField txtField1 = new JTextField(10);
    private JCheckBox checkBox = new JCheckBox("Check Box", true);

    public Notenbilanz3() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.gridwidth = 2;  
        gbc.insets = new Insets(3, 3, 3, 3);
        add(lblNote, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        add(txtField1, gbc);
        gbc.gridx = 1;
        add(checkBox, gbc);

        checkBox.addItemListener(l -> {
            String text = l.getStateChange() == ItemEvent.SELECTED ? LABEL_TEXT : " ";
            lblNote.setText(text);
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()-> {
            JFrame frame = new JFrame("Foo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Notenbilanz3());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
...