2017-02-09 18 views
-2

JButton имеет другой вид, когда перевернулся. Этот внешний вид отличается от «выбранного» внешнего вида.Как сделать JButton появляться «как перевернутый»

Я хочу отобразить мою кнопку «как если бы» она была перевернута, чтобы пользователь понял, что если он нажмет клавишу «Возврат», эта кнопка будет запущена.

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

В моем случае достаточно сильный сигнал - это внешний вид кнопки, когда она перевернулась.

Как это сделать?

Более подробную информацию о ситуации, для тех, кто хочет немного:

  • У меня есть список кнопок, представляющих параметры, и текстовое поле в верхней части, которая действует как фильтр на кнопках
  • когда фильтр таков, что остается только один вариант, нажатие на возврат напрямую нажимает кнопку этого параметра
  • на самом деле пользователю пришлось бы выбрать кнопку с вкладкой или стрелкой, а затем нажать enter.
  • так, что ярлык не очевидно, что я хочу, чтобы сигнализировать его пользователю
+0

Используйте ['setDefaultButton()'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JRootPane.html#setDefaultButton-javax.swing.JButton-). –

+0

Возможная дубликация [Разрешение клавиши «Ввод» для нажатия кнопки отправки, в отличие от использования только MouseClick] (http://stackoverflow.com/questions/13731710/allowing-the-enter-key-to-press-the -submit-button-as-resist-to-only-using-mo) –

+0

@catalinaisland, я отредактировал вопрос, чтобы устранить непонимание.Это отдельные проблемы, и установка по умолчанию не решает мою проблему. –

ответ

-2
button.getModel().setRollover(true); 
+0

, пожалуйста, объясните, как ваш ответ решает вопрос OP. –

+1

Переключение - это не то же самое, что нажатие кнопки, и не то, что пользователь будет ожидать, если возврат приведет к тому же действию, что и нажатие кнопки. Лучшее решение состоит в том, чтобы сделать кнопку кнопкой по умолчанию для JRootPane, так что нажатие кнопки возврата вызывает нажатие кнопки. –

+0

Вы путаете рулон с «по умолчанию», есть различия, которые любой пользователь будет использовать для использования ОС. Также возможно, что эффект может быть удален пользователем, перемещающим мышь в и из управляющего модуля – MadProgrammer

0

Основываясь на ваш вопрос, что вы «действительно» хотите, это JRootPane#setDefaultButton, который будет выделить кнопку, в ОС конкретный способ и если пользователь нажимает клавишу по умолчанию «действие» (Enter в большинстве случаев), будем называть это ActionListener

Например ...

MacOS Example

Кнопка «нормальная», это просто старый добрый JButton, то Hacked устанавливает rollOver на разрешенный и Default был установлен в качестве кнопки по умолчанию для JRootPane

Как вы можете видеть, что вы предложить исправить ничего не делает на MacOS, не знаю, что это может сделать и на других платформах

Я предлагаю вам взглянуть на How to Use Root Panes для получения более подробной информации

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRootPane; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JButton asDefault = new JButton("Default"); 

     public TestPane() { 
      JButton hack = new JButton("Hacked"); 
      hack.getModel().setRollover(true); 
      hack.setRolloverEnabled(true); 
      asDefault.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Defaulted"); 
       } 
      }); 
      add(new JButton("Normal")); 

      add(hack); 
      add(asDefault); 
     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      JRootPane rootPane = SwingUtilities.getRootPane(this); 
      if (rootPane != null) { 
       rootPane.setDefaultButton(asDefault); 
      } 
     } 

    } 
} 

Так, используя button.getModel().setRollover(true); не работает на всех платформах и на тех платформах, на которых он работает, я подозреваю, что пользователю просто нужно будет переместить указатель мыши на него, чтобы вернуть его в нормальное состояние.

+0

* вы предлагаете, что исправление ничего не делает на MacOS * ... хорошо, что я развился на MacOS, и это устранило мою проблему. Вот почему я разместил его здесь. –

+0

@VicSeedoubleyew Извините, что на основании моего кода примера он не работает – MadProgrammer

+0

@VicSeedoubleyew Можете ли вы предоставить мне исполняемый пример, который работает? Потому что я не могу заставить его работать, и я говорю не только о одной строке кода, но и о том, что я могу запустить и увидеть работу, потому что мой пример кода не был, и он содержит вашу единственную строку – MadProgrammer