【发布时间】:2011-08-09 07:03:23
【问题描述】:
见标题。我尝试将组件方向更改为 RIGHT_TO_LEFT,但这产生了意想不到的副作用 - 对于具有指定首选大小的组件,它的行为很奇怪。
(JDK 1.6.0_23,Eclipse VE)
编辑
这是一个例子:
我们有JFrame 和jMainScrollPane。在jMainScrollPane 中,我们放置一个jMainPanel。现在将jMainPanel 的首选大小设置为比jMainScrollPane 窄。 jMainPanel 仍将占用 jMainScrollPane 上的所有空间。现在将jMainScrollPane 的方向更改为RIGHT_TO_LEFT,看看会发生什么。
示例代码(更改jMainScrollPane 的方向以查看差异):
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class TestFrame extends JFrame {
private JPanel jContentPane = null;
private JScrollPane jMainScrollPane = null;
private JPanel jMainPanel = null;
public TestFrame(){
super();
initialize();
}
private void initialize(){
this.setSize(480, 339);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane(){
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJMainScrollPane(), BorderLayout.CENTER);
}
return jContentPane;
}
private JScrollPane getJMainScrollPane(){
if (jMainScrollPane == null) {
jMainScrollPane = new JScrollPane();
jMainScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jMainScrollPane.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
jMainScrollPane.setViewportView(getJMainPanel());
}
return jMainScrollPane;
}
private JPanel getJMainPanel(){
if (jMainPanel == null) {
jMainPanel = new JPanel();
jMainPanel.setLayout(new BorderLayout());
jMainPanel.setPreferredSize(new Dimension(30, 30));
}
return jMainPanel;
}
}
EDIT2
由于这种奇怪的性质,我已向 Oracle 提交了一个错误。他们给我发了一个错误链接
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7038455
目前还没有这样的错误 - 我想,它正在检查中。
但是,问题仍然存在 - 是否有解决方法或其他方法?
【问题讨论】:
-
@Manoj 似乎@Frozen_Spider 已经尝试过提到的问题的答案,但对结果不满意。
-
@Frozen_Spider 当你写“里面的布局被破坏”时,你能告诉我们你的意思吗?还是发个截图?
-
我同意。给定的解决方案应该有效。我已经在
JTable和JScrollpane上对其进行了测试。JScrollpane没有设置任何首选尺寸。 -
我注意到你有两个
JScrollPanes...主要的一个查看jMainPanel,第二个什么也没查看。你为什么要这样设计?如果您的意图是触发jMainPanel的垂直滚动条,您只需要JMainPanel.setPreferredSize(new Dimension(500, 400));并删除我看不到目的的第二个JScrollPane。
标签: java swing jscrollpane