JButton不适合我吗?

时间:2014-02-12 23:29:13

标签: java swing sorting jbutton actionlistener

我正在创建一个程序,您可以使用JButtons选择选择排序或合并排序,它使用Graphics对条形图的形式对int数组进行排序,其中数组中的每个元素都是一个条形。

但由于某种原因,编译器没有接收我的按钮按下,我试图使用    在if语句中(selection.equals(e.getSource())但它不起作用,我错过了一些明显的或什么?

public class Animation extends Canvas implements ActionListener{
JPanel panel;
JButton Selection;
JButton Merge;
boolean selection, merge;


int[] random = new int[25];
Sorter sort = new Sorter();
public Animation(){
    Selection = new JButton("Selection sort");
    Selection.addActionListener(this);
    Selection.setActionCommand("select");
    Merge = new JButton("Merge sort");
    Merge.addActionListener(this);
    Merge.setActionCommand("merge");
    panel = new JPanel();
    panel.add(Selection);
    panel.add(Merge);
    setBackground(Color.WHITE);
    selection=false;
    merge=false;

}
public void actionPerformed(ActionEvent e) {
    if("select".equals(e.getActionCommand())){
        selection = true;
        repaint();

    }
    else if("merge".equals(e.getActionCommand())){
        merge = true;
        repaint();
    }
}

public void paint (Graphics window){

    Random r = new Random();
    for(int i=0; i<random.length; i++){
        int randomInt = r.nextInt(100) + 1;
        random[i] = randomInt;
    }
    window.setColor(Color.MAGENTA);
    if(selection==true){
        for(int i=0; i< random.length-1; i++){
            int smallest = i;
            for(int j = i+1; j< random.length; j++){
                if(random[j] < random[smallest])
               smallest = j;        
                }
            if( smallest != i) {
                int least = random[smallest];
                random[smallest] = random[i];
                random[i] = least; 
                drawIt(random, window);
                window.setColor(Color.WHITE);
                drawIt(random, window);
                window.setColor(Color.MAGENTA);
            }
    }
    }

    drawIt(random, window);
    }
public void drawIt (int[] a, Graphics window1){
    int x=128;
    int height = 200;
    for(int i=0; i<a.length; i++){
        window1.drawLine(x, 200, x, height-a[i]);
        window1.drawLine(x+1, 200, x+1, height-a[i]);
        window1.drawLine(x+2, 200, x+2, height-a[i]);
        x+=20;
    }
    try {
        Thread.currentThread().sleep(100);
    } catch(Exception ex) {

    }

    }

   }

继承了主要类来运行它:

public class AnimationRunner extends JFrame{
private static final int WIDTH = 800;
private static final int HEIGHT = 250;
JButton Selection;
JButton Merge;

public AnimationRunner()
{
    super("Sorting Animation");
    setSize(WIDTH,HEIGHT);
    Animation a = new Animation();
    Merge = new JButton("Merge sort");
    Selection = new JButton("Selection sort");
    Merge.setSize(120, 30);
    Selection.setSize(120,30);
    Merge.setLocation(200, 30);
    Selection.setLocation(400, 30);
    this.add(Merge);
    this.add(Selection);
    ((Component)a).setFocusable(true);
    getContentPane().add(new Animation());
    setVisible(true);
}

public static void main( String args[] )
{

    AnimationRunner run = new AnimationRunner();
}
   }

2 个答案:

答案 0 :(得分:3)

您可以为主类中的每个操作创建一个按钮,并将这些按钮添加到您的JFrame中。您还可以创建Animation类的两个实例。你创建的一个,setfocusable然后什么都不做。然后创建另一个并添加到JFrame的contentPane。

在动画构造函数中,您再次为每个动作创建一个按钮,这次设置动作命令。然后将这些添加到面板中。此面板永远不会添加到任何内容中,因此永远不会看到这些按钮。

您看到的按钮不是您为其定义动作命令的按钮。

此外,您应该避免使用setSize()Use Layout Managers来定义组件的大小。

答案 1 :(得分:2)

存在一系列级联问题......

AnimationRunner课程中,您可以创建名为JButtonMerge sort的两个Selection sort,并将其添加到主框架中。这就是屏​​幕上的实际情况。此按钮没有附加侦听器,因此在单击时不会通知任何正文......

Animation课程中,您可以创建两个名为JBttonsMerge sort的{​​{1}},并将其添加到Selection sort(以及panel的实例),永远不会添加到任何东西。这意味着你永远不可能点击它们......

你似乎并不了解绘画在Swing中是如何工作的,而且似乎假设你以某种方式控制绘画过程。

绘画由Swing中的paint子系统控制,该系统在其认为合适的时间和地点安排并执行绘画循环。这意味着您的JPanel方法可能会因多种原因而被调用,其中许多原因是您无法控制的。

从绘画过程中删除排序逻辑并放入某种模型中,您可以控制其状态。然后使用自定义绘制功能呈现模型的状态。

paint是一种不适合自定义绘画的方法,您应该使用paint。你破坏了油漆链,这可能会阻止组件渲染子组件和/或在系统中引入系列油漆工件

请查看Performing Custom PaintingPainting in AWT and Swing了解详情

Swing是一个单线程框架工作。这意味着阻止Event Dispatching Thread的任何事情都会阻止它将新的重绘请求或事件处理到系统中。这将导致您的程序看起来像是&#34;挂起&#34;。在你的情况下,你很可能只会看到绘画过程的最终结果......经过短暂的延迟。

相反,请考虑使用paintComponent引入安全delty并在每次滴答时更新模型。

请查看Concurrency in SwingHow to use Swing Timers了解详情

预计Swing程序可以在各种硬件和软件平台上运行,所有这些都有自己的DPI和字体渲染方法。这使得您的设计很难满足这些系统的所有可能需求。

通过提供布局管理API,Swing使这一过程变得更加容易,这使得小提琴工作无需做出这些决定。请查看Laying Out Components Within a Container了解更多详情

您还应该看一下Code Conventions for the Java Programming Language,它会让人们更容易阅读您的代码。

您可能会发现某些有利的example