2013-12-14 4 views
0

Я хочу показать нормальный JButton как отключенный, не устанавливая его в setEnabled (false)!Paint Swing JButton as disabled

Я просто хочу показать, что эта кнопка не включена, но если пользователь нажимает кнопку, она должна вызывать actionlistener как обычно.

Так что я сделал это:

import java.awt.Graphics; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class SwingTests { 

    private static void createWindow() { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     MyButton button = new MyButton("Press"); 
     button.setEnabled(false); 

     panel.add(button); 
     frame.add(panel); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createWindow(); 
      } 
     }); 
    } 
} 

class MyButton extends JButton { 
    private boolean enabled = false; 

    public MyButton(String text) { 
     super(text); 
     super.setEnabled(true); 
    } 

    @Override 
    protected void paintBorder(Graphics g) { 
     if (isEnabled()) 
      super.paintBorder(g); 
     else 
      ; // paint disabled button 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     if (isEnabled()) 
      super.paintComponent(g); 
     else 
      ; // paint disabled button 
    } 

    @Override 
    public void setEnabled(boolean b) { 
     enabled = b; 
    } 

    @Override 
    public boolean isEnabled() { 
     return enabled; 
    } 
} 

Я "просто" нужно знать, что писать в paintComponent (г) и paintBorder (г).

+0

* «Я просто хочу, чтобы показать, что эта кнопка не включена, но если пользователь запихивает кнопку она должна вызывать ActionListener как обычно.» * Звук как еще один «непригодного GUI» в процессе создания. Что такое прецедент, когда это действительно имеет смысл? * –

+0

* «кнопка не включена, но если пользователь нажимает кнопку, она должна вызывать actionlistener как обычно» * Предполагается ли, что кнопка является пасхальным яйцом? Я не знаю, чего вы пытаетесь достичь. –

+0

Я знаю, что это против дизайна GUI Propper с «Звуком как еще один« непригодный графический интерфейс »при создании« вы частично правы! Но я хочу это, потому что если он отключен, и пользователь нажимает кнопку, я показываю сигнал тревоги, почему эта кнопка отключена! – Nikolai

ответ

0

, если он отключен, и пользователь нажимает кнопку i, сигнализирует, почему эта кнопка отключена!

Добавить кнопку MouseListener на кнопку, когда она отключена. Затем вы можете обработать событие mouseClicked(), чтобы отобразить «будильник».

1

, если он отключен, и пользователь нажимает кнопку i, сигнализирует, почему эта кнопка отключена!

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

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JToggleButton; 
import javax.swing.SwingUtilities; 

public class TestGUI { 
    public TestGUI() { 
     JFrame frame = new JFrame(); 
     final JButton button = new JButton("Press Me"); 
     final JToggleButton enable = new JToggleButton("Enable/Disable"); 
     enable.setSelected(true); 
     button.setToolTipText("Enabled"); 
     enable.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (enable.isSelected()) { 
        button.setEnabled(true); 
        button.setToolTipText("Enabled"); 
       } else { 
        button.setEnabled(false); 
        button.setToolTipText("Not Enabled"); 
       } 

      } 

     }); 
     frame.add(button, BorderLayout.CENTER); 
     frame.add(enable, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new TestGUI(); 
      } 
     }); 
    } 
} 
Смежные вопросы