3

JTabbedPaneカスタム タブ コンポーネントを使用しています。そのコンポーネントにはJLabel(タブのタイトルを表示する) とJButton(閉じるボタン) が含まれています。JLabelマウスイベントの受信を停止するテキストを変更するJLabelと、ラベルを直接クリックしてもそのタブを選択できなくなり、ラベルの周りをクリックするとタブを選択できます。何か案は?

コードのスニペット:

class ShellPanelTabComponent extends JPanel implements ActionListener{

    private ShellPanel panel;
    private JLabel label;

    public ShellPanelTabComponent(final ShellPanel panel){
      super(new FlowLayout(FlowLayout.LEFT, 0, 0));
      this.panel = panel;
      setOpaque(false);

      label = new JLabel(panel.getTitle());
      label.setFocusable(false);
      add(label);
      label.setBorder(BorderFactory.createEmptyBorder(2,0,0,5));

      //now the button
      CloseButton closeButton = new CloseButton(panel);
      add(closeButton);
      closeButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent ae) {
      panel.getShell().removeShellPanel(panel);
    }

    /**
     * @return the label
     */
    public JLabel getLabel() {
      return label;
    }
  }
4

3 に答える 3

2

How to Use Tabbed PanesTabComponentsDemoで説明されているように、 でそのような問題を見た覚えはありません。参考として、コードをその例と比較することができます。

ButtonTabComponent補遺:を含めるようにリファクタリングしますgetLabel()。このバージョンのrunTest()inTabComponentsDemoは、目的の動作を示すボタンを追加します。具体的には、ボタンを押すたびにタブが再描画され、拡大されたタイトルが表示されます。

更新: の後に正しいタブ コンポーネントを変更しますpane.remove()

public void runTest() {
    pane.removeAll();
    for (int i = 0; i < tabNumber; i++) {
        final int titleIndex = i;
        String title = "Tab " + titleIndex;
        final JButton button = new JButton("Relabel tab");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int index = pane.indexOfComponent(button);
                ButtonTabComponent btc = (ButtonTabComponent)
                    pane.getTabComponentAt(index);
                JLabel label = btc.getLabel();
                pane.setTitleAt(index, label.getText() + titleIndex);
                label.invalidate();
                pane.repaint();
            }
        });
        pane.add(title, button);
        initTabComponent(i);
    }
    tabComponentsItem.setSelected(true);
    pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
    scrollLayoutItem.setSelected(false);
    this.setPreferredSize(new Dimension(500, 200));
    this.pack();
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}
于 2010-07-01T14:31:10.407 に答える
2

投稿が見つかりませんが、最近このような質問を覚えているようです。問題は、「カスタム コンポーネント」がマウス イベントを受け取るため、タブ付きペインに渡されないことだと思います。提案された解決策は、dispatchEvent(...) メソッドを使用して、マウス イベントを適切なタブに再ディスパッチすることでした。

于 2010-07-01T14:51:55.197 に答える
0

この問題は、さらに掘り下げた後にここに投稿した問題に関連しています。setToolTipTextがマウスイベントを消費する場合の回避策は?

于 2010-07-09T21:42:03.490 に答える