微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我在 MyPanel 类中创建和显示面板时遇到问题

如何解决我在 MyPanel 类中创建和显示面板时遇到问题

我正在使用 Java Swing 进行 Uni 项目。我想创建一个包含温度和其他变量的统计面板。

我在 MyPanel 类中创建和显示面板时遇到问题。 当我将类 Main 中的 MyPanel p = new MyPanel() 替换为类 paintComponent方法 MyPanel内容时,它可以工作,但反过来不行。我想在一个单独的类中创建面板,然后调用它。

public class Main extends JFrame {
  
public static void main(String[] args) {
    SwingUtilities.invokelater(new Runnable() {
        public void run() {
            JPanel p = createAndShowGUI();
        }
    });
}

    private static JPanel createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventdispatchThread());
        JFrame f = new JFrame("Swing Demo");
        f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); 
       
        MyPanel p = new MyPanel(); 

        f.add(p);
        //f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
        return p;
    } 
}
public class MyPanel extends JPanel {

    private JLabel TemperaturLabel ;
    private JTextField Temperatur ;
    private JLabel LuftfeuchtigkeitLabel;
    private JTextField Luftfeuchtigkeit;
    private JLabel luftdruckLabel;
    private JTextField luftdruck;
    private JLabel VorhersageLabel; 
    private JPanel Panel;

    protected void paintComponent(Graphics g) {
        TemperaturLabel = new JLabel("Temperatur: ");
        Temperatur = new JTextField(2);

        LuftfeuchtigkeitLabel  = new JLabel("Luftfeuchtigkeit: ");
        Luftfeuchtigkeit  = new JTextField(3);

        luftdruckLabel = new JLabel("Luftdruck: ");
        luftdruck = new JTextField(4);

        Panel= new JPanel( new GridBagLayout());

        VorhersageLabel = new JLabel("Vorhersage:------"); 

        GridBagConstraints c = new GridBagConstraints();
        c.insets= new Insets(10,10,10);

        c.gridx=0;
        c.gridy=1;
        Panel.add(TemperaturLabel,c);
        c.gridx=1;
        c.gridy=1;
        Panel.add(Temperatur,c);
        c.gridx=0;
        c.gridy=2;
        Panel.add(LuftfeuchtigkeitLabel,c);
        c.gridx=1;
        c.gridy=2;
        Panel.add(Luftfeuchtigkeit,c);
        c.gridx=0;
        c.gridy=3;
        Panel.add(luftdruckLabel,c);
        c.gridx=1;
        c.gridy=3;
        Panel.add(luftdruck,c);
        c.gridx=0;
        c.gridy=4;
        Panel.add(VorhersageLabel,c);
        c.gridx=1;
        c.gridy=4;
    } 

    public Dimension getPreferredSize() {
        return new Dimension(900,700);
    }
}

解决方法

所以你期待看到这样的东西?

enter image description here

该代码中有许多逻辑错误导致了许多问题。这是更正后的代码,其中大部分都带有注释。 (有些没有固定,因为它们最终没有太大区别。)

根本问题来自扩展和创建 JPanel 的实例。最终出现在框架中的是未添加任何内容的扩展面板!

import java.awt.*;
import javax.swing.*;

// Use meaningful names for classes,attributes and methods!
// Don't. Extend. JFrame! 
// public class Main extends JFrame {
public class MyPanelDisplayProblem {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // See comments below
                // JPanel p = createAndShowGUI();
                createAndShowGUI();
            }
        });
    }

    // why is this method returning anything? It makes no sense to do that.
    // private static JPanel createAndShowGUI() {
    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "
                + SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Swing Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Oh my! This clashes with another name in my 'junk code' package!
        // Again. Descriptive names!
        // MyPanel p = new MyPanel();
        WeatherPanel p = new WeatherPanel();

        f.add(p.getPanel());
        //f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }
}

/* Don't extend panels either,unless custom painting. */
//class WeatherPanel extends JPanel {
class WeatherPanel {    

    /*
     *  Please learn common Java nomenclature (naming conventions - e.g. 
    `EachWordUpperCaseClass`,`firstWordLowerCaseMethod()`,`firstWordLowerCaseAttribute` unless it is an `UPPER_CASE_CONSTANT`) 
    and use it consistently.
     */
    private JLabel TemperaturLabel ;
    private JTextField Temperatur ;
    private JLabel LuftfeuchtigkeitLabel;
    private JTextField Luftfeuchtigkeit;
    private JLabel luftdruckLabel;
    private JTextField luftdruck;
    private JLabel VorhersageLabel; 
    private JPanel Panel;

    /*
    The resoning here is entirely wrong. Components should be created and 
    added from within a constructor!
    */
    // protected void paintComponent(Graphics g) {
    public WeatherPanel() {
        TemperaturLabel = new JLabel("Temperatur: ");
        Temperatur = new JTextField(2);

        LuftfeuchtigkeitLabel  = new JLabel("Luftfeuchtigkeit: ");
        Luftfeuchtigkeit  = new JTextField(3);

        luftdruckLabel = new JLabel("Luftdruck: ");
        luftdruck = new JTextField(4);

        Panel= new JPanel( new GridBagLayout());

        VorhersageLabel = new JLabel("Vorhersage:------"); 

        GridBagConstraints c = new GridBagConstraints();
        c.insets= new Insets(10,10,10);

        c.gridx=0;
        c.gridy=1;
        Panel.add(TemperaturLabel,c);
        c.gridx=1;
        c.gridy=1;
        Panel.add(Temperatur,c);
        c.gridx=0;
        c.gridy=2;
        Panel.add(LuftfeuchtigkeitLabel,c);
        c.gridx=1;
        c.gridy=2;
        Panel.add(Luftfeuchtigkeit,c);
        c.gridx=0;
        c.gridy=3;
        Panel.add(luftdruckLabel,c);
        c.gridx=1;
        c.gridy=3;
        Panel.add(luftdruck,c);
        c.gridx=0;
        c.gridy=4;
        Panel.add(VorhersageLabel,c);
        c.gridx=1;
        c.gridy=4;
    } 
    
    // Now to get the panel that is created,we can add a 'get panel' method. 
    public JPanel getPanel() {
        return Panel;
    }

    /**
     * This is both unnecessary and counterproductive. 
     * See [Should I avoid the use of set(Preferred|Maximum|Minimum)Size 
     * methods in Java Swing?](http://stackoverflow.com/q/7229226/418556)  
     * (Yes.)
     */
    /*
    public Dimension getPreferredSize() {
        return new Dimension(900,700);
    }
    */
}
,

我拿走了你的代码,重新排列了它,并添加了一些东西来获得这个 GUI。

Swing Demo

我重新编写了您的 createAndShowGUI 方法以删除静态并使用我创建的新 getPanel 方法。

我重新编写了您的 TemperaturePanel 类以创建并显示一个 JPanel。我按列、行顺序组织您的 Swing 组件,以便我可以直观地验证 Swing 组件。我添加了缺失的 JTextField。我创建了 getter 方法,因此您可以实际获取和设置 JTextFields 中的值。

我格式化了代码并使用了正确的驼峰式变量名。

这是修改后的代码。我将 TemperaturePanel 设为内部类,以便我可以将此代码作为一个块发布。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TemperatureGUI {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TemperatureGUI().createAndShowGUI();
            }
        });
    }
    
    private void createAndShowGUI() {
        System.out.println("Created GUI on EDT? " + 
                SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Swing Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TemperaturePanel p = new TemperaturePanel();
        f.add(p.getPanel());
        // f.add(new MyPanel());
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
    
    public class TemperaturePanel {

        private JTextField temperatur;
        private JTextField luftfeuchtigkeit;
        private JTextField luftdruck;
        private JTextField vorhersage;

        private JPanel panel;
        
        public TemperaturePanel() {
            this.panel = createAndShowPanel();
        }
        
        private JPanel createAndShowPanel() {
            JPanel panel = new JPanel(new GridBagLayout());
            panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));

            GridBagConstraints c = new GridBagConstraints();
            c.anchor =  GridBagConstraints.LINE_START;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.weightx = 1.0;
            c.insets = new Insets(10,10);

            c.gridx = 0;
            c.gridy = 1;
            JLabel temperaturLabel = new JLabel("Temperatur: ");
            panel.add(temperaturLabel,c);

            c.gridx = 1;
            c.gridy = 1;
            temperatur = new JTextField(10);
            panel.add(temperatur,c);

            c.gridx = 0;
            c.gridy = 2;
            JLabel luftfeuchtigkeitLabel = new JLabel("Luftfeuchtigkeit: ");
            panel.add(luftfeuchtigkeitLabel,c);

            c.gridx = 1;
            c.gridy = 2;
            luftfeuchtigkeit = new JTextField(10);
            panel.add(luftfeuchtigkeit,c);

            c.gridx = 0;
            c.gridy = 3;
            JLabel luftdruckLabel = new JLabel("Luftdruck: ");
            panel.add(luftdruckLabel,c);

            c.gridx = 1;
            c.gridy = 3;
            luftdruck = new JTextField(10);
            panel.add(luftdruck,c);

            c.gridx = 0;
            c.gridy = 4;
            JLabel vorhersageLabel = new JLabel("Vorhersage:------");
            panel.add(vorhersageLabel,c);

            c.gridx = 1;
            c.gridy = 4;
            vorhersage = new JTextField(10);
            panel.add(vorhersage,c);

            return panel;
        }

        public JTextField getTemperatur() {
            return temperatur;
        }

        public JTextField getLuftfeuchtigkeit() {
            return luftfeuchtigkeit;
        }

        public JTextField getLuftdruck() {
            return luftdruck;
        }

        public JTextField getVorhersage() {
            return vorhersage;
        }

        public JPanel getPanel() {
            return panel;
        }
        
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。