简体   繁体   English

添加 ScrollPane 使我的 JTextArea 消失

[英]Adding a ScrollPane is making my JTextArea disappear

If I have the scrollbar, the JTextArea just vanishes.如果我有滚动条,JTextArea 就会消失。 Without it, everything is fine.没有它,一切都很好。 Can someone please explain this to me?有人可以向我解释一下吗? And how to fix it!以及如何修复!

Also, as an aside, is it possible to change the color or set a border on the scrollpane?另外,顺便说一句,是否可以在滚动窗格上更改颜色或设置边框?

Here is the relevant code:这是相关的代码:

        //Text Container
    JPanel textCon = new JPanel();
    textCon.setOpaque(false);
    textCon.setLayout(new GridLayout(1,3));
    add(textCon);

    //Left Filler
    JPanel left = new JPanel();
    left.setOpaque(false);
    textCon.add(left);

    //Text area
    mainText = new JTextArea("SAMPLE");
    mainText.setOpaque(true);
    mainText.setSize(50,30);
    mainText.setLineWrap(true);
    mainText.setWrapStyleWord(true);
    textCon.add(mainText);

    //Set textAre fonts, colors, border/padding
    mainText.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GREEN), BorderFactory.createEmptyBorder(10, 10, 10, 10)));
    mainText.setFont(new Font("sansserif", Font.BOLD, 10));
    mainText.setForeground(Color.GREEN);
    mainText.setBackground(Color.BLACK);

    //Scroll Bar
    scroller = new JScrollPane(mainText);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    mainText.add(scroller);

And here is the rest of it, just in case!这是它的其余部分,以防万一!

import java.awt.*;
import java.awt.event.*;
import java.awt.Toolkit.*;
import javax.swing.*;
import java.io.*;
import javax.swing.border.*;
import java.util.*;

class ProjectMain extends JFrame
{
//Declare String/Array for mainText
String output = "";
String [] hero;
int page = 0;
JTextArea mainText;
JScrollPane scroller;

public ProjectMain()
{
    //Set Background
    setTitle("JLA Viewer");
    setSize(1920,1080);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    setContentPane(new JLabel(new ImageIcon("bg.png")));
    setLayout(new GridLayout(3,1));

    //Refresh Background
    setSize(1919,1079);
    setSize(1920,1080);

    //Label Container
    JPanel labelCon = new JPanel();
    labelCon.setOpaque(false);
    labelCon.setLayout(new BorderLayout());
    add(labelCon);

    //Top Label
    JLabel topLabel = new JLabel("JLA Profile Viewer");
    topLabel.setHorizontalAlignment(SwingConstants.CENTER);
    topLabel.setForeground(Color.GREEN);
    topLabel.setOpaque(false);
    topLabel.setFont(new Font("sansserif", Font.BOLD, 30));
    labelCon.add(BorderLayout.NORTH,topLabel);

    //Logo
    ImageIcon logo = new ImageIcon("logo.jpg");
    JLabel logoLabel = new JLabel();
    logoLabel.setHorizontalAlignment(SwingConstants.CENTER);
    logoLabel.setIcon(logo);
    labelCon.add(BorderLayout.SOUTH,logoLabel);

    //Text Container
    JPanel textCon = new JPanel();
    textCon.setOpaque(false);
    textCon.setLayout(new GridLayout(1,3));
    add(textCon);

    //Left Filler
    JPanel left = new JPanel();
    left.setOpaque(false);
    textCon.add(left);

    //Text area
    mainText = new JTextArea("SAMPLE");
    mainText.setOpaque(true);
    mainText.setSize(50,30);
    mainText.setLineWrap(true);
    mainText.setWrapStyleWord(true);
    textCon.add(mainText);

    //Set textAre fonts, colors, border/padding
    mainText.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GREEN), BorderFactory.createEmptyBorder(10, 10, 10, 10)));
    mainText.setFont(new Font("sansserif", Font.BOLD, 10));
    mainText.setForeground(Color.GREEN);
    mainText.setBackground(Color.BLACK);

    //Scroll Bar
    scroller = new JScrollPane(mainText);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    mainText.add(scroller);

    //Right Filler
    JPanel right = new JPanel();
    right.setOpaque(false);
    textCon.add(right);

    //Button Container
    JPanel buttonContainer = new JPanel();
    buttonContainer.setOpaque(false);
    add(BorderLayout.SOUTH,buttonContainer);

    //PREV Button
    JButton prev = new JButton("PREV");
    prev.setOpaque(false);
    ActionListener PrevList = new PrevButton(); //Call Button Listener
    prev.addActionListener(PrevList);
    buttonContainer.add(prev);

    //EXIT Button
    JButton exit = new JButton("EXIT");
    exit.setOpaque(false);
    ActionListener ExitList = new ExitButton(); //Call Button Listener
    exit.addActionListener(ExitList);
    buttonContainer.add(exit);

    //NEXT Button
    JButton next = new JButton("NEXT");
    next.setOpaque(false);
    ActionListener NextList = new NextButton(); //Call Button Listener
    next.addActionListener(NextList);
    buttonContainer.add(next);

    //File Handling
    try
    {
        File inputFile = new File ("ProjectInputFile.txt");
        Scanner scanner = new Scanner(inputFile);

        while(scanner.hasNextLine())
        {
            output = output + (scanner.nextLine() + "\n");
        }
    }
    catch(IOException ioe)
    {

    }

    //Add split strings to array
    hero = output.split("@");
}

//Prev button event listener
public class PrevButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        page = page - 1;
        if(page < 0)
        {
            page = hero.length;
        }
        mainText.setText(hero[page]);
    }
}

//Exit button event listener
public class ExitButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        setVisible(false);
        dispose();
        System.exit(0);
    }
}

//Next button event listener
public class NextButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        page++;
        if(page > (hero.length))
        {
            page = 0;
        }
        mainText.setText(hero[page]);
    }
}

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

} }

This line这条线

mainText.add(scroller); mainText.add(scroller);

attempts to add a JScrollPane to a JTextArea .尝试将JScrollPane添加到JTextArea You have already set the ViewPortView of the JScrollPane so this line is unnecessary.您已经设置了JScrollPaneViewPortView ,因此不需要此行。

You will still need to add the JSrolllPane :您仍然需要添加JSrolllPane

textCon.add(scroller);

Also make sure to call JFrame#setVisible after all components have been added.还要确保在添加所有组件调用JFrame#setVisible

setVisible(true);

is it possible to change the color or set a border on the scrollpane?是否可以在滚动窗格上更改颜色或设置边框?

Sure.当然。 Instead of setting the border on the JTextArea mainText , set it on the JScrollPane .不是在JTextArea mainText上设置边框,而是在JScrollPane上设置它。

Side notes:旁注:

  • Don't silently catch IOException without showing the exception content不要在不显示异常内容的情况下静默捕获IOException
  • JFrames are typically used directly rather than extending JFrames通常直接使用而不是扩展

You just need to setBounds(x,y,z,w) to your JScrollPane and not your JTextArea .你只需要setBounds(x,y,z,w)到你的JScrollPane而不是你的JTextArea Then add your JSrcollPane to your JFrame of your JPanel .然后将您的JSrcollPane添加到您的JPanelJFrame中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM