首页 > 解决方案 > 将两个垂直的 JSplitPane 放在一个框架 java 上

问题描述

我是一名新的 Java 程序员,从一开始就使用 stackoverflow。我编写了一个小“游戏”,它是一个基于文本的游戏。好吧,我开始一个图形界面,以区分文本,我会有这个配置

第一张图片

基本上,它是双重分离,具有 3 个水平元素。实际上,我有这个:

第二张图片

我想要分离

第三张图片

我试图将另一个拆分窗格放在第一个窗格的顶部,如下所示:

package sample;

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

class Fenetresaisie extends JFrame {
    public static class Fenetre {
        public final static int HT = 1024;
        public final static int LG = 758;

        public static void main(String[] args) {
            JPanel panel = new JPanel();
            JFrame F = new JFrame("CORONAZE");
            F.setExtendedState(JFrame.MAXIMIZED_BOTH);
            F.setSize(HT, LG);
            F.setVisible(true);

            F.addWindowListener(new gestionFenetre());

            ImageIcon icone = new ImageIcon("images.jpg");

            JLabel image = new JLabel(icone);

            JTextField textField = new JTextField();
            textField.setFont(new Font("Terminal", Font.BOLD, 30));
            textField.setForeground(Color.RED);
            textField.setBackground(Color.black);

            textField.addKeyListener(new java.awt.event.KeyAdapter() {

                public void keyReleased(java.awt.event.KeyEvent e) {
                     textField.getText();
                     e.getKeyChar();
                }
            });

            JLabel label = new JLabel(">texte de l'histoire ici<");
            label.setOpaque(true);
            label.setForeground(Color.green);
            label.setBackground(Color.BLACK);
            panel.add(label);

            JSplitPane topJSplitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, label, textField);
          //  topJSplitPane.setDividerLocation(400);


            JSplitPane bottomJSplitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, topJSplitPane, textField );
            //i added it to have a double separation, but it give 2 sticked splitpane
            F.add(topJSplitPane, BorderLayout.CENTER);
            F.add(bottomJSplitPane, BorderLayout.SOUTH);
            F.setVisible(true);
        }
    }

    static class gestionFenetre extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
}

但它给了我两个粘贴的拆分窗格:-/

第四张图片

你能帮我吗?我希望你能理解我的信息,因为我学英语。如果您想要此问题的下一阶段,请在下面与我联系,谢谢!^^ 这里是实际的图形测试 java 类:

package sample;

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


class Fenetresaisie extends JFrame {

    public static class Fenetre {
        public final static int HT = 1024;
        public final static int LG = 758;

        public static void main(String[] args) {
            JPanel panel = new JPanel();
            JFrame F = new JFrame("CORONAZE");
            F.setExtendedState(JFrame.MAXIMIZED_BOTH);
            F.setSize(HT, LG);
            F.setVisible(true);

            F.addWindowListener(new gestionFenetre());

            ImageIcon icone = new ImageIcon("images.jpg");

            JLabel image = new JLabel(icone);

            JTextField textField = new JTextField();
            textField.setFont(new Font("Terminal", Font.BOLD, 30));
            textField.setForeground(Color.RED);
            textField.setBackground(Color.black);

            textField.addKeyListener(new java.awt.event.KeyAdapter() {

                public void keyReleased(java.awt.event.KeyEvent e) {
                     textField.getText();
                     e.getKeyChar();
                }

            });



            JLabel label = new JLabel(">texte de l'histoire ici<");
            label.setOpaque(true);
            label.setForeground(Color.green);
            label.setBackground(Color.BLACK);
            panel.add(label);

            JSplitPane topJSplitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, label, textField);
            topJSplitPane.setDividerLocation(400);


           // JSplitPane bottomJSplitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, topJSplitPane, textField );
            //i added it to have a double separation, but it give 2 sticked splitpane
            F.add(topJSplitPane, BorderLayout.CENTER);
           // F.add(bottomJSplitPane, BorderLayout.SOUTH);
            F.setVisible(true);
        }
    }

    static class gestionFenetre extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
}

标签: javaswingjframejsplitpane

解决方案


你在你的问题中写道

我是一名新的 Java 程序员,从一开始就使用 stackoverflow

我真的认为学习Swing编程的方法是遵循一个从基础开始,逐渐进步的学习曲线。每个人都有自己喜欢的学习方式,例如参加课程、观看视频或阅读书籍。个人比较喜欢书。如果你也这样做,那么我可以推荐一些。

你也在你的问题中写道

我编写了一个小“游戏”

我会说这对于初学者来说是一个非常雄心勃勃的项目。虽然我确信有些人从雄心勃勃的项目开始学习得最好,但我想说他们是少数。

也就是说,正确实现您的 GUI 的关键是深入了解Swing的工作原理,特别是布局管理器Component大小,以及您可以在代码中的什么位置设置这些Component大小。

下面的代码最初将显示您想要的 GUI,因为我从您的问题中了解到,这就是您现在要完成的工作。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class WindowCapture extends WindowAdapter implements Runnable {
    private JFrame  frame;
    private JLabel  label;
    private JSplitPane  splitPane;
    private JSplitPane  topPane;

    @Override // java.lang.Runnable
    public void run() {
        showGui();
    }

    @Override // java.awt.event.WindowAdapter
    public void windowOpened(WindowEvent event) {
        int height = event.getWindow().getHeight();
        splitPane.setDividerLocation(0.7);
        double high = height * 0.7;
        height = (int) Math.rint(high);
        high = height * 0.8;
        height = (int) Math.rint(high);
        label.setPreferredSize(new Dimension(event.getWindow().getWidth(), height));
    }

    private JTextField createBottomPane() {
        JTextField textField = new JTextField(20);
        textField.setFont(new Font("Terminal", Font.BOLD, 30));
        textField.setForeground(Color.RED);
        textField.setBackground(Color.black);
        return textField;
    }

    private JSplitPane createSplitPane() {
        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, createTopPane(), createBottomPane());
        splitPane.setDividerLocation(0.4);
        return splitPane;
    }

    private JSplitPane createTopPane() {
        label = new JLabel(">texte de l'histoire ici<");
        label.setOpaque(true);
        label.setForeground(Color.green);
        label.setBackground(Color.BLACK);
        topPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                                            label,
                                            new JPanel());
        topPane.setDividerLocation(0.9);
        return topPane;
    }

    public void showGui() {
        frame = new JFrame("Window Capture");
        frame.addWindowListener(this);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        frame.add(createSplitPane());
        frame.setVisible(true);
    }

    /**
     * Start here!
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new WindowCapture());
    }
}

这是正在运行的应用程序的屏幕截图。

费内特


推荐阅读