Java 将多个Jtextareas添加到同一JScrollPane中

Java 将多个Jtextareas添加到同一JScrollPane中,java,swing,user-interface,jscrollpane,Java,Swing,User Interface,Jscrollpane,我知道有很多关于它的问题,但我都读了。大多数人喜欢将文本区域添加到面板中,并将此面板添加到JScrollPane中。我试过了,但不起作用 这是我的密码 应用类 package gui; import javax.swing.SwingUtilities; public class AppSed { public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public vo

我知道有很多关于它的问题,但我都读了。大多数人喜欢将文本区域添加到面板中,并将此面板添加到JScrollPane中。我试过了,但不起作用

这是我的密码

应用类

package gui;

import javax.swing.SwingUtilities;

public class AppSed {

public static void main(String[] args){

SwingUtilities.invokeLater(new Runnable(){
    public void run(){

        new MainFrame();
    }
    });
}
}
大型机类

package gui;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MainFrame extends JFrame {

private TextPanel textPanel;
private ToolBar toolBar;

public MainFrame(){
    super("Sed Debugger");

    setLayout(new BorderLayout());

    textPanel = new TextPanel();
    toolBar = new ToolBar();
    add(textPanel,BorderLayout.CENTER );
    add(toolBar, BorderLayout.NORTH);

    setJMenuBar(createMenuBar());
    setSize(1200,800);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public JMenuBar createMenuBar(){
     JMenuBar menuBar = new JMenuBar();

     JMenu file = new JMenu("File");
     JMenu debug = new JMenu("Debug");
     JMenu help = new JMenu("Help");

     JMenuItem newFile = new JMenuItem("New");
     JMenuItem saveFile = new JMenuItem("Open");
     JMenuItem openFile = new JMenuItem("Save");
     JMenuItem exit = new JMenuItem("Exit");

     file.add(newFile);
     file.add(openFile);
     file.add(saveFile);
     file.add(exit);

     JMenuItem run = new JMenuItem("Run");
     JMenuItem stop = new JMenuItem("Stop");
     JMenuItem refresh = new JMenuItem("Refresh");
     JMenuItem stepIn = new JMenuItem("Step In");
     JMenuItem stepOut = new JMenuItem("Step Out");
     JMenuItem stepOver = new JMenuItem("Step Over");
     JMenuItem breakPoint = new JMenuItem("New Breakpoint");

     debug.add(run);
     debug.add(stop);
     debug.add(refresh);
     debug.add(stepIn);
     debug.add(stepOut);
     debug.add(stepOver);
     debug.add(breakPoint);

     JMenuItem commentHelp = new JMenuItem("Comment Help");
     JMenuItem about = new JMenuItem("About");

     help.add(commentHelp);
     help.add(about);

     menuBar.add(file);
     menuBar.add(debug);
     menuBar.add(help);

     return menuBar;
}
}
文本面板类

package gui;

import java.awt.Dimension;
public class TextPanel extends JPanel {
private InputPane input ; 
private JScrollPane scrollPane;

public TextPanel(){

    setLayout(new GridBagLayout());

    input = new InputPane();
    scrollPane = new JScrollPane(input);

    Dimension dim = scrollPane.getPreferredSize();
    dim.width = 510;
    dim.height = 290;
    scrollPane.setPreferredSize(dim);

    GridBagConstraints gc = new GridBagConstraints();

    gc.gridx = 0;
    gc.gridy = 0;
    gc.weightx = 0.25;

    add(scrollPane,gc);

}
}
输入窗格类

package gui;

import java.awt.BorderLayout...;


public class InputPane extends JPanel {

private JTextArea inputText;
private JTextArea lineNumber;
private JScrollPane scrollPane;

public InputPane(){

    setLayout(new BorderLayout());

    Dimension dim = getPreferredSize();
    dim.width  = 500;
    dim.height = 250;
    setPreferredSize(dim);

    setBorder(BorderFactory.createTitledBorder("Original File"));

    inputText = new JTextArea();
    lineNumber = new JTextArea();

    Dimension dimInput = getPreferredSize();
    dimInput.width = 440;
    dimInput.height = 250;
    inputText.setPreferredSize(dimInput);

    Dimension lineDim = getPreferredSize();
    lineDim.width = 50;
    lineDim.height = 250;
    lineNumber.setPreferredSize(lineDim);
    lineNumber.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2,             Color.gray));

    add(inputText,BorderLayout.EAST);
    add(lineNumber,BorderLayout.WEST);

}
我认为应该在滚动窗格的行标题中添加行号textarea,而不是在面板上使用两个文本区域。另外,不要使用setPreferredSize()。默认情况下,使用滚动窗格的目的是因为只有当组件的首选大小大于滚动窗格的大小时,才会显示滚动条

您可能不想使用两个文本区域,而是想查看设计用于在文本组件旁边显示行号的文本区域。行号组件被添加到滚动窗格的行标题中。

您“似乎”试图创建一个“拆分”,行号在左侧,文本在右侧

第一步,停止使用部件的
首选尺寸
拧紧。您无法控制这些组件计算其需求所需的因素

有关更多详细信息,请参阅

相反,使用可用属性提供提示,这可以让它们计算所需的空间量

请查看以了解更多详细信息

例如

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TextPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TextPanel extends JPanel {

        private InputPane input;
        private JScrollPane scrollPane;

        public TextPanel() {

            setLayout(new GridBagLayout());

            input = new InputPane();
            scrollPane = new JScrollPane(input);

            GridBagConstraints gc = new GridBagConstraints();

            gc.gridx = 0;
            gc.gridy = 0;
            gc.weightx = 0.25;

            add(scrollPane, gc);

        }
    }

    public class InputPane extends JPanel {

        private JTextArea inputText;
        private JTextArea lineNumber;

        public InputPane() {

            setLayout(new BorderLayout());

            setBorder(BorderFactory.createTitledBorder("Original File"));

            inputText = new JTextArea(10, 20);
            lineNumber = new JTextArea(10, 4);

            lineNumber.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.gray));

            add(inputText);
            add(lineNumber, BorderLayout.WEST);

        }
    }
}

话虽如此,我还是不鼓励您使用这个过程,并建议您改用
JScrollPane#setRowHeaderView
。有关更多详细信息,请参见和

您似乎正在尝试创建一个“拆分”,左边是行号,右边是文本?是的,正是@MadProgrammerYes,我将编辑代码@Jean FrançoisSavard@nonegravity同样,我不鼓励您以这种方式使用两个
JTextArea
s,最好使用
JScrollPane#setRowHeaderView
,即使添加
lineNumber
s
JTextArea
作为标题视图,也会为您提供更好的解决方案……我在设计GUI方面是新手。谢谢你的建议,我会尽量多了解的。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TextPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TextPanel extends JPanel {

        private InputPane input;
        private JScrollPane scrollPane;

        public TextPanel() {

            setLayout(new GridBagLayout());

            input = new InputPane();
            scrollPane = new JScrollPane(input);

            GridBagConstraints gc = new GridBagConstraints();

            gc.gridx = 0;
            gc.gridy = 0;
            gc.weightx = 0.25;

            add(scrollPane, gc);

        }
    }

    public class InputPane extends JPanel {

        private JTextArea inputText;
        private JTextArea lineNumber;

        public InputPane() {

            setLayout(new BorderLayout());

            setBorder(BorderFactory.createTitledBorder("Original File"));

            inputText = new JTextArea(10, 20);
            lineNumber = new JTextArea(10, 4);

            lineNumber.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.gray));

            add(inputText);
            add(lineNumber, BorderLayout.WEST);

        }
    }
}