【问题标题】:Is it possible to create a panel with a class on the left and right side?是否可以在左侧和右侧创建一个带有类的面板?
【发布时间】:2021-10-12 20:28:51
【问题描述】:

我一直在用 Java Swing 练习我的代码,并且在控制一些项目(例如标签和或按钮)的放置位置方面做得很好,但我想知道你是否可以对类做同样的事情?我只有一个简单的类,它有足够的代码在其中放置一个按钮,仅此而已,我正在尝试创建该类的一个实例,然后控制它放在左侧和右侧,但是当我这样做时,它所做的一切就是用中间的按钮创建两个单独的窗口,就是这样。是我做错了什么,还是你不能用同样的方式上课?

代码:

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

public class Fun extends JFrame
{
    private final int WIDTH = 500;
    private final int HEIGHT = 400;

    public Fun()
    {
        setTitle("Fun Management");
        setSize(WIDTH, HEIGHT);
        
        BuildPanel west = new BuildPanel(); /// BuildPanel is the name of the class that has just a button in it. 
        BuildPanel east = new BuildPanel(); /// 
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        add(west, BorderLayout.WEST); /// I am doing the same thing with the instances as I would with buttons or labesl
        add(east, BorderLayout.EAST);
        
        setVisible(true);
    }
    
    public static void main(String[] args)
    {
        new Fun();
    }
}

【问题讨论】:

  • add() 方法采用 Component 类型,因此如果 BuildPanel 继承自 Component,您可以这样做。但是,通常将 GUI 与“程序逻辑”类分开,所以要小心扩展这样的 GUI 类。要将内容分开,请参阅“MVC”en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
  • 可以分享BuildPanel代码吗?

标签: java swing jpanel layout-manager


【解决方案1】:

我使用了您的代码并创建了以下 GUI。

Oracle 有一个 rad 教程 Creating a GUI With Swing,它将向您展示如何创建 Swing GUI。跳过 Netbeans 部分。

始终通过调用 SwingUtilities invokeLater 方法来启动您的 Swing 应用程序。此方法可确保您的 Swing 组件在 Event Dispatch Thread 上创建和执行。

使用 Swing 组件。除非您想覆盖一个或多个组件方法,否则不要扩展 Swing 组件。

JFrame 方法必须按特定顺序调用。这是我为大多数 Swing 应用程序推荐的顺序。使用JFramepack 方法并让组件调整JFrame 的大小。

我创建了一个BuildPanel 类来构建一个JPanel。这样做有充分的理由,但要小心。您必须管理您创建的类的每个实例。举个例子,如果你想让两个按钮的文本不同怎么办?如果你想分配两个不同的ActionListener 类,每个按钮一个呢?

这是完整的可运行代码。我将 BuildPanel 类设为内部类,因此我可以将代码作为一个块发布。

import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TwoPanelExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TwoPanelExample());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Fun Management");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        BuildPanel west = new BuildPanel(); 
        BuildPanel east = new BuildPanel(); 
        
        frame.add(west.getPanel(), BorderLayout.WEST);
        frame.add(east.getPanel(), BorderLayout.EAST);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public class BuildPanel {
        
        private final JPanel panel;
        
        public BuildPanel() {
            this.panel = createMainPanel();
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel();
            panel.setBorder(BorderFactory.createEmptyBorder(5, 30, 5, 30));
            
            JButton button = new JButton("Click Me");
            panel.add(button);
            
            return panel;
        }

        public JPanel getPanel() {
            return panel;
        }
        
        
    }

}

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多