0

ボタンをクリックしてパネルを再描画しようとしていますが、うまくいきません。setEnabled(true)、setVisible(true)、repaint() などの多くのメソッドを使用してみましたが、どれも機能していません。また、「総投票」ボタンをクリックすると1つのパネルが表示され、「部門ごとの投票」をクリックすると別のパネルが同じ場所に表示されるように、2つのパネルを切り替えたいと思います。

助けてください。前もって感謝します。

ここでコードを提供しています:

public class RSummary extends JFrame implements ActionListener
{
    JFrame rframe = new JFrame();
    JPanel panel1, panel2, panel3, panel4, panel5;
    JTable table;
    JScrollPane scroll;
    JSplitPane splitPane;
    JButton butx;

   public RSummary()
   {

    rframe.setSize(550,300);
    rframe.setLocationRelativeTo(null);

    setSize(550,300);
        rframe.setTitle("Summary Report");

        /* Total Vote  & Department wise vote buttons */
           panel1= new JPanel();
          JButton but1 = new JButton("TOTAL VOTE");
          JButton but2 = new JButton("DEPTARTMENT WISE VOTE");
          but1.addActionListener(this);
          panel1.add(but1);
          panel1.add(but2);

          /* Report contents according to button */
          panel2 = new JPanel();
         String[] columnNames = {"Name", "Department","Phno","LUID","Select"};
        DefaultTableModel model1 = new DefaultTableModel();
        model1.setColumnIdentifiers(columnNames);
        table = new JTable();
        table.setModel(model1); 
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        table.setFillsViewportHeight(true);
        scroll = new JScrollPane(table);
        panel2.add(scroll);
        panel2.setVisible(false);


        /* close button */
        panel3 = new JPanel();
        JButton but4= new JButton("CLOSE");
        but4.addActionListener(this);
        panel3.add(but4);


        /* Page heading */
        panel4 = new JPanel();
        JLabel lab =new JLabel("VOTE SUMMARY REPORT");
        panel4.add(lab);


        /* dummy panel */
        panel5 = new JPanel();
        JButton butx = new JButton("Hello butx");
        panel5.add(butx);


    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
    rframe.add(splitPane);
    rframe.add(panel3,BorderLayout.SOUTH);
    rframe.add(panel4,BorderLayout.NORTH);

    rframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    rframe.setVisible(true);

}  

    public void actionPerformed(ActionEvent ae)
    { 
String action=ae.getActionCommand();

if(action == "CLOSE")
{
    rframe.setVisible(false);
}
if(action == "TOTAL VOTE")
{
    panel2.setVisible(true);  //this code is not working, i want the solution here. 
}

    }
   public static void main(String args[]) throws ClassNotFoundException, SQLException
   {
        new RSummary();

   } 
    }
4

2 に答える 2

3

String最初の問題は、コンテンツではなく、値のオブジェクト参照を比較していることです...

if(action == "TOTAL VOTE")

s が Java によって管理される方法のため、Stringこれらが等しくなる可能性はほとんどありません。

StringJavaでの比較は次を使用して行われますString#equals

if ("TOTAL VOTE".equals(action)) 

2 番目の問題はsetVisible、コンテナー階層を無効化していない可能性があるという事実に関連している可能性があります。これにより、コンテナーを更新する必要があることがレイアウト フレームワークに通知されます。

revalidateあなたには2つの解決策があります.1つ目は親コンテナを呼び出すことです.2つ目はCardLayout、あなたがやろうとしていることだけのために設計された を使用することです...

詳細については、カード レイアウトの使用方法をご覧ください。

コード実行後の更新

一連の複雑な問題があります...

  • どのボタンのアクション コマンドも設定しないため、actionPerformedイベントが発生すると、action実際にはnull
  • RSummaryから拡張されますが、という名前JFrameの 2 番目を作成します。これは非常に紛らわしく、正しいフレームを扱っていないと、さらに問題が発生する可能性があります。JFramerframe

actionCommandボタンのプロパティを設定することから始めます...

JButton but1 = new JButton("TOTAL VOTE");
but1.setActionCommand("TOTAL VOTE");

次に、extends JFrameから削除しRSummaryます。混乱を招くだけで、何のメリットもありません。

フレームを非表示に設定しても、フレームは「閉じられません」。代わりに使用JFrame#dispose

最後に、分割ペインの一部であるコンポーネントを表示しても、分割された仕切りのサイズは変更されません。修正を行ったら、仕切りを手動で移動する必要があります。

空のパネルを分割ペインに配置し、 を使用しCardLayoutて他のコンポーネントを追加し、CardLayout

変更されたコードで更新

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class RSummary extends JFrame implements ActionListener {

    JFrame rframe = new JFrame();
    JPanel panel1, panel2, panel3, panel4, panel5;
    JTable table;
    JScrollPane scroll;
    JSplitPane splitPane;
    JButton butx;

    public RSummary() {

        rframe.setSize(550, 300);
        rframe.setLocationRelativeTo(null);

        setSize(550, 300);
        rframe.setTitle("Summary Report");

        /* Total Vote  & Department wise vote buttons */
        panel1 = new JPanel();
        JButton but1 = new JButton("TOTAL VOTE");
        but1.setActionCommand("TOTAL VOTE");
        JButton but2 = new JButton("DEPTARTMENT WISE VOTE");
        but1.addActionListener(this);
        panel1.add(but1);
        panel1.add(but2);

        /* Report contents according to button */
        panel2 = new JPanel();
        String[] columnNames = {"Name", "Department", "Phno", "LUID", "Select"};
        DefaultTableModel model1 = new DefaultTableModel();
        model1.setColumnIdentifiers(columnNames);
        table = new JTable();
        table.setModel(model1);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        table.setFillsViewportHeight(true);
        scroll = new JScrollPane(table);
        panel2.add(scroll);
        panel2.setVisible(false);


        /* close button */
        panel3 = new JPanel();
        JButton but4 = new JButton("CLOSE");
        but4.addActionListener(this);
        panel3.add(but4);


        /* Page heading */
        panel4 = new JPanel();
        JLabel lab = new JLabel("VOTE SUMMARY REPORT");
        panel4.add(lab);


        /* dummy panel */
        panel5 = new JPanel();
        JButton butx = new JButton("Hello butx");
        panel5.add(butx);

        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
        rframe.add(splitPane);
        rframe.add(panel3, BorderLayout.SOUTH);
        rframe.add(panel4, BorderLayout.NORTH);

        rframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rframe.setVisible(true);

    }

    public void actionPerformed(ActionEvent ae) {
        String action = ae.getActionCommand();

        if ("CLOSE".equals(action)) {
            rframe.dispose();
        }
        if ("TOTAL VOTE".equals(action)) {
            panel2.setVisible(true);  //this code is not working, i want the solution here. 
            panel2.getParent().revalidate();
        }

    }

    public static void main(String args[]) throws ClassNotFoundException, SQLException {
        new RSummary();

    }

}
于 2013-10-26T08:07:08.403 に答える
2

パネルを切り替えるには、次のことができます。

rframe.remove (panelToRemove);
rframe.add(panelToShow);

これがあなたの質問に対する答えですか、それともなぜ再描画したいのですか?

ジオサーチフ

更新: 要約すると: MadProgrammer は正しいです。(CLOSE の場合と同じ)if(action == "TOTAL VOTE")に置き換える必要があります。if(action.equals("TOTAL VOTE"))

actionCommand を追加する必要があります。

JButton but1 = new JButton("TOTAL VOTE");
but1.addActionListener(this);
but1.setActionCommand("TOTAL VOTE");

パネルを変更するには:

if (action.equals("TOTAL VOTE")) {
    try{rframe.remove(panel1;)}catch(Exception e){}//clear window, maybe there is a method
    try{rframe.remove(panel2;)}catch(Exception e){}
    try{rframe.remove(panel3;)}catch(Exception e){}
    rframe.add(panel2);//the panel you want to show
}

もちろん、パネルへの参照を取得する必要がありますactionPerformed(ActionEvent ae)

于 2013-10-26T08:11:54.770 に答える