2016-01-19 7 views
3

У меня есть один LoginScreen и один MainWindow. Когда попытка подключения преуспевает в БД, появляются LoginScreen disposed и MainWindow.UIManager in Button Action

У меня есть одна кнопка: ActionListener для создания JOptionPane. Код успешно работает на самом деле. Я думаю, что у меня три проблемы в Painting. Позвольте мне объяснить проблемы один за другим;

Задача 1;

UIManager UI=new UIManager(); 
Object paneBG = UI.get("OptionPane.background"); 
Object panelBG = UI.get("Panel.background"); 
UI.put("OptionPane.background", Color.red); 
UI.put("Panel.background", Color.red); 

String[] buttons2 = { "EXIT", "OK" }; 
int rc2 = JOptionPane.showOptionDialog(MainWindow.this, 
             panel, 
             "User Input", 
             JOptionPane.INFORMATION_MESSAGE, 
             JOptionPane.PLAIN_MESSAGE, 
             icon, 
             buttons2, 
             buttons2[1] 
            ); 

UI.put("OptionPane.background", paneBG); 
UI.put("Panel.background", panelBG); 

Я использую выше код для изменения background color из OptionPane, показывать пользователю и откатить цвета интерфейса к оригиналу.

Если я непосредственно запустить MainWindow и нажмите на кнопку, цвет изменен (уверен панель и кнопки область сохранить исходные цвета в OptionPane, но в других областях OptionPane обратиться к красному Это еще одна проблема.), Как это;

enter image description here

Но когда я пришел из LoginScreen, Логин попытка добиться успеха, LoginScreen disposed и MainWindow появляются. Я нажимаю на ту же кнопку, но OptionPane не нарисован сейчас, вот так;

enter image description here

Задача 2;

У меня есть еще одна кнопка в MainWindow, и она создает еще одну OptionPane. Я запускаю MainWindow и нажимаю первую кнопку (которая меняет цвет пользовательского интерфейса и выполняет откат), закройте его, а затем нажмите вторую кнопку (у которой есть еще одна OptinPane) OptionPane по-прежнему окрашена, поэтому цвета пользовательского интерфейса не отскакивают от значений по умолчанию.

Задача 3;

Если мы решим первую и вторую проблему, как я могу сделать transparent эти внутренние панели (которая имеет маркировку и TextField панель одной кнопки и один)

+0

Если вы повторно используете тот же диалог, почему бы не создать настраиваемый 'JDialog'? – user1803551

+0

Потому что мне нужно написать ActionListener для каждой кнопки в JDialog. OptionPane легко использовать, я думаю. На самом деле мне нужна градиентная живопись на OptionPanes. Если я не решу эти проблемы, я обращаюсь к JDialog. –

+0

Затем отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). Обязательно скопируйте код в новый проект * и убедитесь, что он компилируется и запускается, прежде чем публиковать его здесь. – user1803551

ответ

1

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

UIManager.put("OptionPane.background", Color.red); 

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

static void setBackground(Component c, 
          Color color) { 
    if (c instanceof JTextField || c instanceof AbstractButton) { 
     return; 
    } 

    c.setBackground(color); 
    if (c instanceof Container) { 
     Component[] children = ((Container) c).getComponents(); 
     for (Component child : children) { 
      setBackground(child, color); 
     } 
    } 
} 

int show(Icon icon, 
     JComponent panel) { 

    String[] buttons2 = { "EXIT", "OK" }; 
    JOptionPane optionPane = new JOptionPane(panel, 
              JOptionPane.PLAIN_MESSAGE, 
              JOptionPane.DEFAULT_OPTION, 
              icon, 
              buttons2, 
              buttons2[1]); 
    setBackground(optionPane, Color.RED); 

    optionPane.createDialog(MainWindow.this, "User Input").setVisible(true); 

    Object value = optionPane.getValue(); 
    int rc2 = JOptionPane.CLOSED_OPTION; 
    if (value instanceof String) { 
     rc2 = Arrays.asList(buttons2).indexOf(value); 
    } 

    return rc2; 
} 

Вы хотите быть осторожными, чтобы отличить типа сообщения аргументов опцию типа аргументы. Передача как INFORMATION_MESSAGE, так и PLAIN_MESSAGE в качестве аргументов никогда не верна. В documentation указано, что четвертый и пятый аргументы являются типом опций и типом сообщения соответственно; аргумент типа параметра должен быть DEFAULT_OPTION, OK_CANCEL_OPTION, YES_NO_OPTION и т. д.

+0

Этот пример очень поучителен и полезен. Также я могу добавить что-то в этот пример для рисования OptionPane с GradientPaint, я думаю. –

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

  • Нет связанных вопросов^_^