让滚动条与绝对定位一起工作

时间:2013-09-30 03:36:43

标签: java swing jframe jscrollbar

您好我正在尝试制作游戏,我想要做的基本事情是添加带滚动条的JTextArea。这是我的代码:

package TestStuff;

import javax.swing.*;

@SuppressWarnings("serial")
public class JTextAreaTest extends JFrame
{
     public static void main(String[] args)
     {
          new JTextAreaTest();
     }

     public JTextAreaTest()
     {
          this.setSize(1500, 600);
          setDefaultCloseOperation(
               JFrame.EXIT_ON_CLOSE);
          this.setLocation(450, 175);
          this.setExtendedState(JFrame.
MAXIMIZED_BOTH);
          this.setTitle("Game Display Test");

          panel1 = new JPanel(null);

          final JTextArea gameDisplay = new JTextArea(
               500, 300);
          gameDisplay.setBounds(424, 300, 500, 300);
          gameDisplay.setBackground(Color.BLACK);

          Font font = new Font ("Verdana", Font.BOLD, 
              14);
          gameDisplay.setFont(font);
          gameDisplay.setForeground(Color.WHITE);

          final JScrollPane displayScroll = new JScrollPane(
               gameDisplay);
          displayScroll.setHorizontalScrollBarPolicy(
               JScrollPane.HORIZONTAL_SCROLLBAR_AS_
                    NEEDED);
          displayScroll.setVerticalScrollBarPolicy(
               JScrollPane.  
               VERTICAL_SCROLLBAR_AS_NEEDED);

          panel1.add(gameDisplay);
          panel1.add(displayScroll);

          setContentPane(panel1);

          this.setVisible(true);
     }
}

运行时一切正常,但是当文本超出JTextArea的范围时,滚动条永远不会出现!是的,我知道我使用的是绝对定位(没有布局)而且这很糟糕但我在游戏中出于其他原因需要它。提前致谢! (此外,由于某些原因,我无法在我的计算机上连接到此网站,但我之前使用过你们,而且你很棒,所以我必须在手机上输入此内容。抱歉,如果问题的布局搞砸了,电话:P)

2 个答案:

答案 0 :(得分:2)

当你打电话......

panel1.add(gameDisplay);
panel1.add(displayScroll);

您实际上正在从gameDisplay中移除displayScroll,因为组件只能有一个父级。

它确实有效的事实归结为你正在玩gameDisplay面板的位置和大小而不是displayScroll,你应该......

使用

panel1.add(displayScroll);

相反,但要确保只调整displayScroll的大小和位置,因为displayScroll会照顾gameDisplay

答案 1 :(得分:0)

我遇到了类似的问题,解决方案是滚动条内部组件的 setPreferredSize 。我试图在滚动条中绝对定位内容。幸运的是,我确切知道应该是什么尺寸。也许这是一个特例。

final JFrame frame = new JFrame("HelloWorldSwing");
final JPanel panel = new JPanel();
panel.setPreferredSize(PUT SIZE HERE);
panel.setLayout(null);
final JScrollPane scrollPane = new JScrollPane(panel);
frame.getContentPane().add(scrollPane);