gpt4 book ai didi

java - JScrollPane 无法检测到需要滚动的文本

转载 作者:行者123 更新时间:2023-12-02 11:33:49 25 4
gpt4 key购买 nike

这是我的代码的简化版本,如果这不足以诊断问题,请发表评论,我将发布更多代码:

//All Necessary Imports

JFrame window;
Container container;
JPanel mainTextPanel;
JScrollPane scrollPane;
JTextArea mainText;
Font normalFont = new Font("Times New Roman", Font.PLAIN,30);

ChoiceHandler choiceHandler = new ChoiceHandler();

//Unrelated Variables

public class setUp()
{
public setUp()
{
window = new JFrame();
window.setSize(825,600);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.white);
window.setLayout(null);

container = window.getContentPane();

mainTextPanel = new JPanel();
mainTextPanel.setBounds(100,100,600,250);
mainTextPanel.setBackground(Color.white);
container.add(mainTextPanel);

//more code goes here
}
}

public class mainText extends setUp
{
public mainText()
{
mainText = new JTextArea("Tons of text here");
mainText.setBounds(100,100,600,250);
mainText.setBackground(Color.white);
mainText.setForeground(Color.black);
mainText.setFont(normalFont);
mainText.setLineWrap(true);
scrollPane = new
JScrollPane(mainText,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

mainTextPanel.add(scrollPane);
mainTextPanel.revalidate();
mainTextPanel.repaint();
mainTextPanel.setVisible(true);

//more code goes here
}
}

我的问题是,当我运行代码时,一切正常,除了 ScrollPane 显然无法检测到文本超出范围这一事实。滚动条就在那里,唯一的问题是你不能用它滚动,它看起来就像文本不超过限制时的滚动条。

当我在创建滚动条时删除 ALWAYS 修饰符时,滚动条消失,再次证明滚动条根本没有检测到越界文本。

最佳答案

我只是想向您指出为什么 null 布局很糟糕......代码

Why Null layouts suck

这就是您的代码在我的系统上的显示方式。老实说,那里有滚动条,但您尝试取消布局管理 API 导致 JScrollPane 超出了父容器的物理边界。

您似乎也不了解坐标系在 Swing 中与父组件上下文的关系如何工作,但如果您使用布局管理器,则不需要。

因此,在稍微更新代码以使用布局管理器之后

Scrollable

你知道有一个可以滚动的解决方案......

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;
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();
}

mainText mt = new mainText();
mt.window.pack();
mt.window.setLocationRelativeTo(null);
mt.window.setVisible(true);

}
});
}

public class setUp {

JFrame window;
Container container;
JPanel mainTextPanel;
JScrollPane scrollPane;
JTextArea mainText;
Font normalFont = new Font("Times New Roman", Font.PLAIN, 30);

public setUp() {
window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.white);

container = window.getContentPane();

mainTextPanel = new JPanel(new BorderLayout());
mainTextPanel.setBackground(Color.white);
container.add(mainTextPanel);

//more code goes here
}
}

public class mainText extends setUp {

public mainText() {
mainText = new JTextArea("Tons of text here");
mainText.setBackground(Color.white);
mainText.setForeground(Color.black);
mainText.setFont(normalFont);
mainText.setLineWrap(true);
scrollPane = new JScrollPane(mainText, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

mainTextPanel.add(scrollPane);
mainTextPanel.revalidate();
mainTextPanel.repaint();

//more code goes here
}
}

}

But where is the horizontal scroll bar?

mainText.setLineWrap(true); 就不需要它了

But the JTextArea is to small!

所以呢?提供一些适当的大小提示,组件可以使用这些提示来更好地确定它可能需要多大。

类似于 mainText = new JTextArea("Tons of text here", 1, 10); 会产生

Long text

所以,长而短的答案是,使用布局管理 API,Swing 是围绕它的使用而设计的,它将为您节省大量的头痛和愚蠢的边缘情况

But on my system the scroll bars don't appear!?

😓回到开头,不要收200美元再读一遍。之所以会出现不同的情况是因为缺乏布局支持

But I don't want to use/understand layout managers!

艰难。如果您想避免这些类型的“奇怪”问题,那么布局管理 API 是正确的方向。花时间尝试不同的布局管理器并尝试不同的组合,您不必拘泥于只使用一种,几乎所有复杂的 UI 都会在单个复合 UI 中使用至少两个(如果不是更多)布局管理器

关于java - JScrollPane 无法检测到需要滚动的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49091428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com