2014-02-12 3 views
0

Я делаю программу, в которой вы выбираете сортировку выбора или сортировку слияния с помощью JButtons, и сортирует массив int в виде столбчатой ​​диаграммы с использованием Graphics, где каждый элемент массива представляет собой панель.JButton не работает для меня?

но по какой-то причине компилятор не получает нажатия на кнопки, я пытался использовать (selection.equals(e.getSource()) в инструкции if, но он не работает, я что-то не вижу или что?

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) { 

    } 

    } 

    } 

Heres основной класс, чтобы запустить его:

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(); 
} 
    } 
+0

'Thread.currentThread() сон (100).' 'Является paint' не то, как сделать анимацию – MadProgrammer

+1

Почему' 'Merge' и Selection' JButton экземпляров в вашем основном классе и в вашем классе анимации? – Arbiter

ответ

2

Есть ряд проблем, каскадные ...

В AnimationRunner классе вы создаете два JButton называеться Merge sort и Selection sort и добавить их к основной раме. Это то, что на самом деле находится на экране. Эти кнопки не имеют никаких слушателей прилагаются, поэтому никогда не уведомлять какое-либо тело, когда они щелкают ...

В Animation классе вы создаете два JBttons называеться Merge sort и Selection sort и добавить их в panel (и экземпляр JPanel), который никогда ничего не добавлял. Это означает, что вы никогда не сможете щелкнуть по ним ...

У вас, похоже, нет понимания того, как картина работает в Swing и, похоже, предполагается, что вы каким-то образом управляете процессом рисования.

Окраска контролируется подсистемой краски в Swing, которая планирует и выполняет циклы краски, когда и где она сочтет нужным. Это означает, что ваш метод paint может быть вызван по целому ряду причин, многие из которых вы не контролируете.

Удалите логику сортировки из процесса окраски и поместите в какую-то модель, состояние которой вы можете контролировать. Затем используйте пользовательские возможности рисования, чтобы отобразить состояние модели.

paint - это неуместный метод для индивидуальной раскраски, и вы должны использовать paintComponent.Вы нарушили лакокрасочную цепь, которая может предотвратить компонент от предоставления дочерних компонентов и/или вводить серии краски артефактов в программу

Посмотрите на Performing Custom Painting и Painting in AWT and Swing для получения более подробной информации

Свинга это однопоточная рамки работы , Это означает, что все, что блокирует Thread Dispatching Thread, предотвратит его от обработки новых запросов или событий перерисовки в систему. Это приведет к тому, что ваша программа будет выглядеть так, как будто она «висела». В вашем случае вы, скорее всего, только когда-нибудь увидите конечный результат процесса рисования ... после небольшой задержки.

Вместо этого рассмотрите возможность использования javax.swing.Timer, чтобы ввести безопасную информацию и обновить модель при каждом ее тике.

Взгляните на Concurrency in Swing и How to use Swing Timers для более подробной информации

программы свинг, как ожидается, работать на различных аппаратных и программных платформ, все там с собственными представлениями о DPI и шрифтовых рендеринга подходов. Это затрудняет размещение вашего проекта во всех возможных потребностях этих систем.

Свинг делает это проще, предоставляя API управления компоновкой, который заставляет скрипку работать над принятием этих решений. Взгляните на Laying Out Components Within a Container для получения более подробной информации.

Вы также должны посмотреть на Code Conventions for the Java Programming Language, это сделает его eaiser для людей, чтобы прочитать ваш код.

Вы могли бы найти это example некоторых benifit

+0

Спасибо вам за эту полезную информацию! Мне нужно руководство, и это именно то, что я искал. Я не очень разбираюсь в живописи Swing, так спасибо! – user3255621

3

Вы создаете кнопку для каждого действия в основной класс и добавить их к вашему JFrame. Вы также создаете два экземпляра вашего класса анимации. Тот, который вы создаете, setfocusable, ничего не делает. Затем другой, который вы создаете и добавляете в contentPane JFrame.

В своем конструкторе анимации вы снова создаете кнопку для каждого действия, на этот раз устанавливая команды действия. Затем вы добавляете их в панель. Эта панель никогда не добавляется ни к чему, и поэтому эти кнопки никогда не будут видны.

Кнопки, которые вы видите, не являются кнопками, для которых вы определили команды действия.

Также следует избегать использования setSize() и Use Layout Managers для определения размеров ваших компонентов.

Смежные вопросы