当前位置: 首页 > 知识库问答 >
问题:

错误的组件(在单独的 JPanel 类中)获得焦点

訾晋
2023-03-14

我正在开发一个具有以下结构的应用程序:

  1. FrmMain(其中包含我想添加“布局”面板的面板)
  2. PnlNewCase(设置为接收区域特定面板的“布局”面板)
  3. PnlNewCaseNotes(添加到PnlNewCase的面板之一)
  4. PnlNewPart sSelect(我存在的祸根)

我的想法是,每当我在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;
}

如果需要的话,我也可以张贴每个类的代码(我只是认为这应该足够了)。

期待您的评论:)

共有1个答案

姬寂离
2023-03-14

后退一步,仔细检查代码。让我们假设你正在做这样的事情

add(new PnlNewCase(true));

如果你仔细阅读代码,你会发现它调用:

  • <code>PnlNewCase</code>构造函数(为实例字段分配默认值)
    • 初始化组件
      • 检查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服务器。