1 个 JFrame 中的 2 个不同大小的 JPanel

2 Different sized JPanels in 1 JFrame

我知道还有其他类似的问题,但是 none 这些解决方案对我有用,或者我不知道如何实施这些解决方案。

我正在制作一个非常基本的房间素描器,我有一个带有 jlabels 的侧面板,我将来会拖到更大的 jpanel 上。但是我如何制作一个侧面 JPanel,我可以用它来点击家具并将其拖到那里?

我的代码如下所示:

public class maj11 {
    JSplitPane splitPaneV;
    JSplitPane splitPaneH;
    JFrame frame;
    JPanel panel, panel2;
    JLabel l1, l2, l3, l4, l5, l6, l7, l8, l9, l10;
    ImageIcon b1, b2, b3, b4, b5, b6, b7, b8, b9, b10;

    public static void main(String[] args) {
        new maj11();
    }

    public maj11() {
        b1 = new ImageIcon("/Users/a/Desktop/nyabilder/toa.png");
        b2 = new ImageIcon("/Users/a/Desktop/nyabilder/badkar.png");
        b3 = new ImageIcon("/Users/a/Desktop/nyabilder/bank.png");
        b4 = new ImageIcon("/Users/a/Desktop/nyabilder/disk.png");
        b5 = new ImageIcon("/Users/a/Desktop/nyabilder/dusch.png");
        b6 = new ImageIcon("/Users/a/Desktop/nyabilder/fridge.png");
        b7 = new ImageIcon("/Users/a/Desktop/nyabilder/soffa.png");
        b8 = new ImageIcon("/Users/a/Desktop/nyabilder/spis.png");
        b9 = new ImageIcon("/Users/a/Desktop/nyabilder/wall.png");
        b10 = new ImageIcon("/Users/a/Desktop/nyabilder/window.png");
        l1 = new JLabel(b1);
        l2 = new JLabel(b2);
        l3 = new JLabel(b3);
        l4 = new JLabel(b4);
        l5 = new JLabel(b5);
        l6 = new JLabel(b6);
        l7 = new JLabel(b7);
        l8 = new JLabel(b8);
        l9 = new JLabel(b9);
        l10 = new JLabel(b10);

        frame = new JFrame("Room Designer");
        panel = new JPanel();
        panel2 = new JPanel();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 600);
        // frame.pack();
        panel.setLayout(new GridLayout(5, 2, 10, 10));
        panel.setSize(200, 600);

        //panel2.setLayout(new BorderLayout());

        panel.add(l1);
        panel.add(l2);
        panel.add(l3);
        panel.add(l4);
        panel.add(l5);
        panel.add(l6);
        panel.add(l7);
        panel.add(l8);
        panel.add(l9);
        panel.add(l10);

        frame.add(panel);
    }
}

现在的输出是:imgur

我希望它是:imgur

以正确的顺序创建 Swing GUI 会很有帮助。

  1. main方法中必须调用SwingUtilitiesinvokeLater方法将Swing组件的创建和执行放在Event Dispatch Thread.

  2. 然后创建一个JFrame。创建 JFrame 的方法必须按特定顺序调用。

  3. 然后创建您的 JPanels。我通常在单独的 class.

  4. 中创建一个 JPanel
  5. 在 JPanel 中按行、列顺序创建您的 Swing 组件。将与每个 Swing 组件相关的方法调用放在一起。

将您的 GUI 代码分开可以帮助您发现错误并帮助您组织代码以使其更易于理解。

我把 ModelingPanel 涂成了橙色,所以你可以看出 IconPanelModelingPanel 之间的区别。您必须在代码中重新添加您的家具图标。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

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

public class Maj11 implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Room Designer");
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);

        IconPanel iconPanel = new IconPanel();
        frame.add(iconPanel.getPanel(), 
                BorderLayout.BEFORE_LINE_BEGINS);

        ModelingPanel modelingPanel = 
                new ModelingPanel();
        frame.add(modelingPanel.getPanel(), 
                BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public class IconPanel {

        private JPanel panel;

        public IconPanel() {
            createPartControl();
        }

        private void createPartControl() {
            panel = new JPanel();
            panel.setLayout(
                    new GridLayout(5, 2, 10, 10));
            panel.setPreferredSize(
                    new Dimension(200, 600));

            JLabel l1 = new JLabel(" ");
            panel.add(l1);

            JLabel l2 = new JLabel(" ");
            panel.add(l2);

            JLabel l3 = new JLabel(" ");
            panel.add(l3);

            JLabel l4 = new JLabel(" ");
            panel.add(l4);

            JLabel l5 = new JLabel(" ");
            panel.add(l5);

            JLabel l6 = new JLabel(" ");
            panel.add(l6);

            JLabel l7 = new JLabel(" ");
            panel.add(l7);

            JLabel l8 = new JLabel(" ");
            panel.add(l8);

            JLabel l9 = new JLabel(" ");
            panel.add(l9);

            JLabel l10 = new JLabel(" ");
            panel.add(l10);
        }

        public JPanel getPanel() {
            return panel;
        }

    }

    public class ModelingPanel {

        private JPanel panel;

        public ModelingPanel() {
            createPartControl();
        }

        private void createPartControl() {
            panel = new JPanel();
            panel.setBackground(Color.ORANGE);
            panel.setPreferredSize(
                    new Dimension(600, 600));
        }

        public JPanel getPanel() {
            return panel;
        }

    }

}