gpt4 book ai didi

java - 使用 GridBagLayout 为 JFrame 自定义 FocusTraversalPolicy

转载 作者:行者123 更新时间:2023-11-30 06:33:43 25 4
gpt4 key购买 nike

我有一个包含四个组件的 JFrame:三个 JPanel 和一个 JTabbedPane。两个面板具有可选择的组件,大约位于 BorderLayout.NORTH 和 EAST,而 JTabbedPane 大约位于 CENTER。 TabbedPane 的选项卡在 Pane 底部对齐。我说大约是因为实际布局是使用 GridBagLayout 完成的(抱歉!)。

目前,焦点遍历循环是这样的:

Current Cycle:  
1) North JPanel
2) East JPanel
3) JTabbedPane selected tab
4) JTabbedPane selected tab content

但是,我希望它是:

Desired Cycle:  
1) North JPanel
2) JTabbedPane selected tab content
3) JTabbedPane selected tab
4) East JPanel

我已经尝试了 Java Focus Guide 给出的基于 vector 的 FocusTraversalPolicy运气不好:我无法让光标向下进入选项卡面板内容。

然后我研究了扩展/更改那里的其他 FocusTraversalPolicy 类,但也无济于事。

我相当确定问题是当前的 FocusTraversalPolicy 使用屏幕上的组件位置来确定布局周期。从技术上讲,侧面板在屏幕上的位置高于中间的选项卡式面板。不过,我真的很想改变这一点。还有其他人遇到这个/有任何见解吗?谢谢!!

编辑:

这是一个带有正确布局代码的 SSCCE 演示了这个问题。请注意:问题不在于布局,因为它必须保持不变。

package SO;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

public class ssccee7729709{
JPanel north;
JPanel north2;
JPanel east;
JTabbedPane center;
JFrame content;

void initialize() {
north = new JPanel(new FlowLayout()) {
{
this.setBackground(Color.CYAN);
}
};
north.add(new JLabel("Title panel"));

north2 = new JPanel(new FlowLayout()) {
{
this.setBackground(Color.RED);
}
};
north2.add(new JLabel("north2 Panel"));
north2.add(new JTextField(4));
north2.add(new JTextField(4));

east = new JPanel(new GridLayout(3,1)) {
{
this.setBackground(Color.BLUE);
}
};
east.add(new JButton("b1"));
east.add(new JButton("b2"));

center = new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.WRAP_TAB_LAYOUT);
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel(new GridLayout(4,1));
panel.add(new JLabel("Panel " + i));
panel.add(new JTextField(6));
panel.add(new JTextField(6));
panel.add(new JTextField(6));
center.addTab("Tab " + i, panel);
}

content = new JFrame();
content.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

content.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
{
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 4;
gbc.weightx = 1;
content.add(north, gbc);
}
{
gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.PAGE_START;
gbc.gridwidth = 1;
gbc.weightx = 1;
// gbc.weighty = .1;
gbc.gridy = 1;
gbc.gridx = 1;
content.add(north2, gbc);
}
{
gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = GridBagConstraints.RELATIVE;
gbc.gridheight = GridBagConstraints.RELATIVE;
gbc.weighty = 1;
gbc.gridy = 2;
content.add(center, gbc);
}
{
gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.VERTICAL;
gbc.anchor = GridBagConstraints.SOUTHEAST;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.gridx = 3;
gbc.gridheight = 4;
content.add(east, gbc);
}

content.setVisible(true);
content.pack();
}

public static void main(String args[]) {
ssccee7729709 so = new ssccee7729709();
so.initialize();
}

}

最佳答案

如果您查看默认策略 LayoutFocusTraversalPolicy 的源代码,它几乎只是扩展了 SortingFocusTraversalPolicy。 ,它需要一个 Comparator<? extends Component> .

您应该能够提供自己的比较器,它是一个内部类,因此可以访问父组件,并通过查看自身及其父组件来提供适当的比较值。

查看 LayoutComparator 的源代码可能不会有什么坏处。这就是 LayoutFocusTraveralPolicy 使用的。

关于java - 使用 GridBagLayout 为 JFrame 自定义 FocusTraversalPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729709/

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