2

コードを更新しましたが、JButton の actionListener だけが必要であることに気付きました (それらが実際にすべての作業を行っているため)。私のロジックは、ソート部分でオフになっています。jButtons で値を交換することはできますが、出力は正しいように見えますが、ソート メカニズムのどこを台無しにしているかを突き止めようとしています。このプログラムは、ラジオ ボタンで開始点を選択し、JButton をスワップする別の場所を選択することで、正しく動作するはずです。(たとえば、ラジオ 3 の次に jbutton 8 を押すと、3 番目の要素が 8 番目の位置に移動します) かなり近いことはわかっていますが、わだち掘れになってしまい、外を見ることができません。ポインタはありますか?(免責事項これはボーナスポイントプログラミング2課題です)。

新しいコード

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class GUIswitch 
{
    public static void main(String[] args) 
    {


        GUIswitchClass myWindow = new GUIswitchClass();
        myWindow.setSize(300,350);
        myWindow.setLocation(100,100);
        myWindow.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        myWindow.setVisible( true );



    }
}
//====================================================================================================================
class GUIswitchClass extends JFrame                                         //fields
{
        JPanel          leftPanel       =   new JPanel();
        JPanel          rightPanel      =   new JPanel();                       
        JPanel          allPanel        =   new JPanel();
        JRadioButton    rdoBut[]        =   new JRadioButton[10];
        JButton         teamBut[]       =   new JButton[10];
        ButtonGroup     rdBtGp          =   new ButtonGroup();
        String          rdoButNum[]     =   {"1","2","3","4","5","6","7","8","9","10"};
        String          teamName[]      =   {"A","BB","CCC","DDDD","EEEEE","FFFFFF",
                                            "GGGGGGG","HHHHHHHH","IIIIIIIII","JJJJJJJJJJ"};
        //String            from;
        //String            to;
        int from;
        int to;
        String fromTo;  //??
        int i;

    public GUIswitchClass()                                                 //constructor
    {
        super("Proj 3");


        fromTo  = setButs();
        //to        = teamBut[ teamName[i] ];

    }
    private String setButs()
    {
        int i;
        leftPanel.setLayout(new GridLayout(10,1));
        rightPanel.setLayout(new GridLayout(10,1));
        for(i=0;i<10;i++)
        {
            rdoBut[i] = new JRadioButton(rdoButNum[i]);
            rdoBut[i].setFont(new Font("Courier", Font.PLAIN, 30) );
            rdBtGp.add(rdoBut[i]);
            leftPanel.add(rdoBut[i]);   
        }

        /*for(i=0;i<10;i++)
            if(rdoBut[i].isSelected() )
            {
                from = Integer.parseInt(rdoBut[i].getText() );
            }
        */
        for(i=0;i<10;i++)
        {
            teamBut[i]  =   new JButton(teamName[i]);
            teamBut[i].setFont(new Font("Courier", Font.PLAIN, 30) );
            teamBut[i].setHorizontalAlignment(SwingConstants.LEFT);
            teamBut[i].addActionListener(new checkHdlr() );
            rightPanel.add(teamBut[i]);
        }

        allPanel.setLayout(new BorderLayout());
            allPanel.add(leftPanel, BorderLayout.WEST);
            allPanel.add(rightPanel, BorderLayout.CENTER);
        add(allPanel);

        return fromTo;



    }
    @SuppressWarnings("unused")
    private class checkHdlr implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            //String userNum;
            //userNum = event.getActionCommand();
            for(i=0;i<10;i++)
                if(rdoBut[i].isSelected() )
                {
                    from = Integer.parseInt(rdoBut[i].getText() );
                }

            for(i=0;i<10;i++)
            {
                if(event.getSource() == teamBut[i])
                {
                    //teamBut[i].
                    teamBut[i].setText(teamName[i]);
                    //to = (int)(teamBut[i]);
                }
            }
            rightPanel.revalidate();                //refresh the panels
            moveTeam(teamName, from, to);
        }
    }   

//--------------------------------------------------------------------------
     public void moveTeam(String teamName[],int from,int to)
      {
        //int             from=0;
        //int             to=0;

        if(from>to)                           //determine direction to move
          moveUp(teamName,from,to);
        else
          moveDown(teamName,from,to);
      }

 //---------------------------------------------------------------------move up
  public static void moveUp(String teamList[], int from, int to)
  {
    String clipboard;
    int    row;

    clipboard = teamList[from];           //copy

    for(row=from;row>to;row--)            //shift others down
      teamList[row] = teamList[row-1];

    teamList[row] = clipboard;            //paste
  }
  //-------------------------------------------------------------------move down
  public static void moveDown(String teamList[], int from, int to)
  {
    String clipboard;
    int    row;

    clipboard = teamList[from];           //copy

    for(row=from;row<to;row++)            //shift others up
      teamList[row] = teamList[row+1];

    teamList[row] = clipboard;            //paste
  }

}

古いコード

import java.awt.*;
import java.awt.event.*;
import java.util.StringTokenizer;

import javax.swing.*;

public class GUIswitch 
{
    public static void main(String[] args) 
    {


        GUIswitchClass myWindow = new GUIswitchClass();
        myWindow.setSize(300,350);
        myWindow.setLocation(100,100);
        myWindow.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        myWindow.setVisible( true );



    }
}
//====================================================================================================================
class GUIswitchClass extends JFrame                                         //fields
{
        JPanel          leftPanel       =   new JPanel();
        JPanel          rightPanel      =   new JPanel();                       
        JPanel          allPanel        =   new JPanel();
        JRadioButton    rdoBut[]        =   new JRadioButton[10];
        JButton         teamBut[]       =   new JButton[10];
        ButtonGroup     rdBtGp          =   new ButtonGroup();
        String          rdoButNum[]     =   {"1","2","3","4","5","6","7","8","9","10"};
        String          teamName[]      =   {"A","BB","CCC","DDDD","EEEEE","FFFFFF",
                                            "GGGGGGG","HHHHHHHH","IIIIIIIII","JJJJJJJJJJ"};
        String          from;
        String          to;
        String fromTo;
        int i;

    public GUIswitchClass()                                                 //constructor
    {
        super("Swap Elements");


        fromTo  = setButs();
        //to        = teamBut[teamName[i]];

    }
    private String setButs()
    {
        int i;
        leftPanel.setLayout(new GridLayout(10,1));
        rightPanel.setLayout(new GridLayout(10,1));
        for(i=0;i<10;i++)
        {
            rdoBut[i] = new JRadioButton(rdoButNum[i]);
            rdoBut[i].setFont(new Font("Courier", Font.PLAIN, 30) );
            rdoBut[i].addActionListener(new checkHdlr() );
            rdBtGp.add(rdoBut[i]);
            leftPanel.add(rdoBut[i]);   
        }

        for(i=0;i<10;i++)
        {
            teamBut [i] =   new JButton(teamName[i]);
            teamBut[i].setFont(new Font("Courier", Font.PLAIN, 30) );
            teamBut[i].setHorizontalAlignment(SwingConstants.LEFT);
            rightPanel.add(teamBut[i]);
        }

        allPanel.setLayout(new BorderLayout());
            allPanel.add(leftPanel, BorderLayout.WEST);
            allPanel.add(rightPanel, BorderLayout.CENTER);
        add(allPanel);

        return fromTo;



    }
    @SuppressWarnings("unused")
    private class checkHdlr implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String userNum;
            userNum = event.getActionCommand();

        }
    }   

//--------------------------------------------------------------------------
     public static void moveTeam(String teamName[],String fromTo)
      {
        int             from;
        int             to;

        if(from>to)                           //determine direction to move
          moveUp(teamName,from,to);
        else
          moveDown(teamName,from,to);
      }

 //---------------------------------------------------------------------move up
  public static void moveUp(String teamList[], int from, int to)
  {
    String clipboard;
    int    row;

    clipboard = teamList[from];           //copy

    for(row=from;row>to;row--)            //shift others down
      teamList[row] = teamList[row-1];

    teamList[row] = clipboard;            //paste
  }
  //-------------------------------------------------------------------move down
  public static void moveDown(String teamList[], int from, int to)
  {
    String clipboard;
    int    row;

    clipboard = teamList[from];           //copy

    for(row=from;row<to;row++)            //shift others up
      teamList[row] = teamList[row+1];

    teamList[row] = clipboard;            //paste
  }
  //---------------------------------------------------------------------display
  public static void disp(String teamList[])
  {
    int r;
    for(r=0;r<10;r++)
      System.out.printf("%2d %s\n",r+1,teamList[r]);
  }
}
4

2 に答える 2

4

JButton 自体を交換するのではなく、JButton の AbstractActions を指定して単純にこれらの Action を交換する方がはるかに簡単です。または、JButton のテキストと actionCommand を交換することもできますが (この方法を使用する場合は両方を行う必要があります)、それには並行して交換を行う必要があり、私にはきれいに感じられません。

于 2012-09-25T02:56:58.840 に答える
3

JRadioButtons をs に置き換えたいと思いJCheckBoxます。これは主に、同時に 2 つを選択することができ、ラジオ ボタンを許可するよりも、この方法でチェック ボックスを選択できるようにする方が理にかなっているからです。

すべてのチェック ボックスに対して単一のアクション リスナーを作成し、すべてのクリックがそれを通過するようにします。

アクション リスナーでjava.util.Listは、現在選択されているオプションを追跡するために a を使用します (配列をたどることもできますが、こちらの方が簡単であることがわかりました)。

リストに2つのアイテムが含まれている場合...

  • 2 つのチェック ボックスの選択を解除し、リストを空にします
  • を使用して、各チェック ボックスの現在のインデックス (または Z オーダー) を取得します。Container.getComponentZOrder(Component)
  • 左パネルから対応するボタンを見つけます (これは、前の手順で取得したインデックス値を使用して実現されます)。Container.getComponent(int)
  • コンポーネントを交換します。これは、setComponentZOrder(Component, int)

何かのようなもの...

int index0 = leftPanel.getComponentZOrder(cb0);
int index1 = leftPanel.getComponentZOrder(cb1);

Component comp0 = rightPanel.getComponent(index0);
Component comp1 = rightPanel.getComponent(index1);

rightPanel.setComponentZOrder(comp0, index1);
rightPanel.setComponentZOrder(comp1, index0);

revalidate()レイアウトを更新するには、フレームも必要です ;)

于 2012-09-25T03:12:50.057 に答える