我正在开发一个具有以下结构的应用程序:
我的想法是,每当我在PnlNewPartsSelection中创建一个新页面时,只要它被实例化,我就会把焦点放在一个特定的JTextField(tfNom)上,但每当我尝试这样做时,焦点都会被设置为另一个JTextFild(tfAddressDetails)。
我想要聚焦的内容(蓝色)与获得聚焦的内容(红色)
我已经试着调试了整个系统,但是还不能确定需要做什么。我也试图用一个更简单的代码重现这个问题,但在这种情况下,它的工作。两者之间唯一值得注意的区别是,简化代码只包含一个JFrame和一个JPanel,而更复杂的代码包含:JFrame -
以下是我正在使用的方法的概要,我希望这些方法可以帮助某人弄清楚发生了什么。
JFrame FrMain:
private void btnNewRepActionPerformed(java.awt.event.ActionEvent evt) {
tabs.addTab("R" + tabNo++, p);
tabs.setSelectedIndex(tabNo);
}
JPanel Pnl新案例:
public PnlNewCase(boolean isNewRep) {
initComponents();
checkRepStatus(isNewRep);
}
private void checkRepStatus(boolean isNewRep) {
if (isNewRep) {
btnNewNote.setVisible(false);
PnlNewCaseNotes p1 = new PnlNewCaseNotes();
pnlNotes.add(p1);
PnlNewPartsSelection p2 = new PnlNewPartsSelection();
JTextField t = p2.getTfNom();
pnlPartsCustomer.add(p2);
t.requestFocusInWindow();
validate();
}
}
JPanel PnlNewCaseNotes备注:
public PnlNewCaseNotes() {
initComponents();
}
JPanel PnlNewPartsSelection:
public PnlNewPartsSelection() {
initComponents();
}
/* A bunch of method calls to add place holders */
public JTextField getTfNom() {
return tfNom;
}
如果需要的话,我也可以张贴每个类的代码(我只是认为这应该足够了)。
期待您的评论:)
后退一步,仔细检查代码。让我们假设你正在做这样的事情
add(new PnlNewCase(true));
如果你仔细阅读代码,你会发现它调用:
初始化组件
检查RepStatus
。此时,您开始构建代码并调用t.requestFocusInWindow
这就是核心问题。当您调用t.requestFocusInWindow
时,组件本身和它所连接的容器都没有添加到UI中,因此该字段不可能被给予焦点。
相反,将组件添加到UI中,然后向字段请求焦点。由于框架的方式,您可能会发现您还需要使用<code>SwingUtilities。invokeLater使焦点工作
也许做一些像。。。
public class PnlNewCase extends JPanel {
private PnlNewPartsSelection p2;
public PnlNewCase(boolean isNewRep) {
//...
}
private void checkRepStatus(boolean isNewRep) {
if (isNewRep) {
//...
p2 = new PnlNewPartsSelection();
//...
//t.requestFocusInWindow();
}
}
public void focusPrimaryField() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
p2.getTfNom().requestFocusInWindow();
}
});
}
}
然后你可以简单地做一些事情...
PnlNewCase newCase = new PnlNewCase(true);
add(newCase);
revalidate();
repaint();
newCase.focusPrimaryField()
作为一个总体概念。
您可能还想看看如何使用焦点子系统以获得更好的理解,也许还有更多的想法
我对此完全陌生..... 问题是,当我切换到任何选项卡时,我无法获得正常的jpanel效果。按钮不能用鼠标点击(可以通过按tab键选择按钮n然后按space键点击),文本字段不能在鼠标点击时选择(只能通过按tab键选择)等。 那么对此有什么解决办法吗??我希望jtabbedpane中的面板像普通jpanel一样工作:)谢谢:)
问题内容: 我有一个里面。我已经注册了一个,我想以此为基础更新。我遇到的问题是我无法集中精力于,因此无法正常工作。我已经知道可以使用了,因为我在上注册了它,并且效果很好。目前,我的代码如下所示: 有人遇到过这样的问题吗?在这方面我缺少什么吗? PS:我内部没有任何组件,我只是在背景上绘制图像,因此我需要将焦点放在JPanel本身而不是JPanel上。 问题答案: 尽管您指出面板可以对焦,但是面板并
我在同一个JPanel上有一个JButton和一个Point(由飞跃运动控制的运动)。但是,它们与顶部的JButton重叠。 有没有办法让我的点始终在JPanel应用程序窗口中的顶部? 这是一个代码片段:
我有一个JTabbedPane。此组件上有四个JPanel。在每个面板上都有一个scrollPanel。最后,每个scrollPanel上都有另一个JPanel。我需要随时跟踪这些最终JPanel中的哪一个。 所以我创建了一个名为activePanel的类变量。对于每个最终的 JPanel,我都设置了一个焦点事件方法,以便当面板获得焦点时,会相应地设置此变量。例如: 不幸的是,这并不像我希望的那样
我得到这个错误 Symfony\Component\Debug\Exception\fatalthrowable错误:传递给Illumb\Routing\Middleware\ThrottlereRequests::addHeaders()的参数1必须是Symfony\Component\HttpFoundation\Response的实例,给定为空, 当在Laravel 5.7的中间件中获取标题
我有两个搜索词“86746184549”和“3302093809”。我正在执行两个单独的术语查询,以获取与每个ID匹配的一个文档。 和 我认为terms查询在这里不起作用,因为它不会返回包含不同字段的文档。 我之所以要组合查询是因为,假设我有100个这样的术语,那么我将打100个电话!!到elasticsearch服务器。