1

JavaSwingでアプリケーションを作成しました。
アプリケーションは、 3つのタブ付きペインJFrameを備えたJTabbedPaneです。

最初のペインには進行状況チェックボックスがあります。チェックボックスが選択されている場合、別のペインをクリックすると、2番目または3番目のペインにERROR「タブ付き1が進行中です」というメッセージが表示されます。

問題は、進行状況チェックボックスが選択されているときに他のペインをクリックすると、最初に選択したペインに移動し、次にリダイレクトのみが機能し、エラーメッセージが2回実行されることです。

どういうわけかエラーメッセージの2回の実行を防ぎましたが、進行状況チェックボックスがクリックされたときにクリックされたペインに移動するのを防ぐことはできません。

誰かがこの問題の解決策を教えてもらえますか?

私の完全なコードを以下に示します。

import javax.swing.JOptionPane;

public class sample extends javax.swing.JFrame {
public static int status=0;
    public sample() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        tab = new javax.swing.JTabbedPane();
        jDesktopPane2 = new javax.swing.JDesktopPane();
        jLabel1 = new javax.swing.JLabel();
        progress = new javax.swing.JCheckBox();
        jDesktopPane4 = new javax.swing.JDesktopPane();
        jLabel2 = new javax.swing.JLabel();
        jDesktopPane5 = new javax.swing.JDesktopPane();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tab.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT);
        tab.setTabPlacement(javax.swing.JTabbedPane.LEFT);
        tab.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tabStateChanged(evt);
            }
        });

        jDesktopPane2.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("TABBED PANE 1  BODY ");
        jLabel1.setBounds(50, 60, 230, 40);
        jDesktopPane2.add(jLabel1, javax.swing.JLayeredPane.DEFAULT_LAYER);

        progress.setText("Progress");
        progress.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                progressItemStateChanged(evt);
            }
        });
        progress.setBounds(50, 40, 90, 23);
        jDesktopPane2.add(progress, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 1", jDesktopPane2);

        jDesktopPane4.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel2.setText("TABBED PANE 2  BODY ");
        jLabel2.setBounds(30, 90, 230, 40);
        jDesktopPane4.add(jLabel2, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 2", jDesktopPane4);

        jDesktopPane5.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel3.setText("TABBED PANE 3  BODY ");
        jLabel3.setBounds(60, 160, 230, 40);
        jDesktopPane5.add(jLabel3, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 3", jDesktopPane5);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tab, javax.swing.GroupLayout.PREFERRED_SIZE, 402, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tab, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    private void progressItemStateChanged(java.awt.event.ItemEvent evt) {
      if(progress.isSelected())
          setStatus(1);
      else
          setStatus(0); 
    }

    private void tabStateChanged(javax.swing.event.ChangeEvent evt) {
       int o=getStatus();
       if(o==1)
       {
        JOptionPane.showMessageDialog(null, "Tabbed 1 Progress!!!", "Confirmation!!!",JOptionPane.ERROR_MESSAGE);
        setStatus(0);
        tab.setSelectedIndex(0);
        setStatus(1);
       }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
               sample s= new sample();
               s.setLocationRelativeTo(null);
               s.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JDesktopPane jDesktopPane2;
    private javax.swing.JDesktopPane jDesktopPane4;
    private javax.swing.JDesktopPane jDesktopPane5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JCheckBox progress;
    private javax.swing.JTabbedPane tab;
    // End of variables declaration

    public static void setStatus(int i) {
       status=i;
    }
    public static int getStatus()
    {
        return status;
    }
}
4

2 に答える 2

2

これは、tabStateChangedイベントを使用しているため、タブが変更されたときにのみイベントがトリガーされるため、イベントタイプをクリックに変更するか、コードを変更して最初にエラーが表示されないようにすることができますが、選択したものを変更します最初にタブを押してからエラーボックスを表示します

int o=getStatus();
       if(o==1 && tab.getSelectedIndex() != 0) //if the selected index isn't 0 and the o == 1
       {
            tab.setSelectedIndex(0);
            JOptionPane.showMessageDialog(null, "Tabbed 1 Progress!!!", "Confirmation!!!",JOptionPane.ERROR_MESSAGE);
            //setStatus(0); delete this
            //setStatus(1); delete this
       }
于 2012-12-28T07:32:26.003 に答える
2

の方法は使えませんJTabbedPaneか?

public void setEnabledAt(int index, boolean enabled)

無効になっているタブをクリックしないように進行状況を開始します

于 2012-12-28T07:40:27.283 に答える