2015-12-05 3 views
-1

У меня есть следующий код Java для окна с двумя текстовыми полями: один редактируемый, другой - нет. Я хотел бы оторвать не редактируемое текстовое поле. Я использую setBackground() функцию и, кажется, работает в конструкторском зрителя Eclipse:Установить фон Swing JTextField

enter image description here

Однако, когда я экспортировать его в jar, в результате приложение выглядит следующим образом:

enter image description here

I я использую Eclipse 4.4.1 под MacOS 10.9.3.

Мой код:

import java.awt.Container; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 

@SuppressWarnings("serial") 
public class TestFrame extends JFrame { 
    GridBagConstraints constraints; 
    JTextField text0; 

    public TestFrame() { 
     super("Test window"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     Container container = getContentPane(); 
     container.setLayout(new GridBagLayout()); 
     JTextField editableTextField, nonEditableTextField; 

     constraints = new GridBagConstraints(); 
     editableTextField = new JTextField("Enter text here"); 
     constraints.gridx=0; 
     constraints.gridy=0; 
     container.add(editableTextField, constraints); 

     constraints = new GridBagConstraints(); 
     nonEditableTextField = new JTextField("See result here"); 
     nonEditableTextField.setBackground(getForeground()); 
     nonEditableTextField.setEditable(false); 
     constraints.gridx=0; 
     constraints.gridy=1; 
     container.add(nonEditableTextField, constraints); 

     pack(); 
    } 

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

Поэтому, у меня есть два вопроса:

  1. Почему поведение отличается в зрителе и jar?
  2. Как «вычеркнуть» текстовое поле в jar?
+1

Как насчет setEnabled (false)? – Berger

+0

@Berger 'setEnabled()' имеет немного другое поведение. Он делает текст серым, но не фоном, и я хотел бы иметь текст стандартного цвета на фоне, который соответствует цвету фона рамки приложения, например, на первом изображении. – Roman

+0

Это может иметь какое-то отношение к внешнему виду и настройкам пользовательского интерфейса. – MadProgrammer

ответ

-1

Оказалось, что на самом деле существует разница между getBackground() и getContentPane().getBackground(). Однако ни один из них не отвечает за фактически увиденный серый экран окна по умолчанию. getForeground() также не подходит для этого цвета; однако по какой-то причине он инициализируется совпадающим значением в средстве просмотра.

однако, как ни, можно переопределить цвет фона по умолчанию через getContentPane().setBackground() (хотя его начальное значение не совпадает):

... 
    Container container = getContentPane(); 
    container.setBackground(new Color(240,240,240)); 
    ... 
    nonEditableTextField.setBackground(container.getBackground()); 
    ... 

Это создает желаемый эффект как при проектировании зрителя и jar:

enter image description here

0

Если вы задали цвет фона переднего плана (который здесь черный), вы получаете все в одном цвете.

setBackground(getForeground()); 

Попробуйте установить другой цвет.

+0

Это не отвечает ни на один из моих вопросов. Почему тогда он не становится черным в телезрителе? – Roman

+1

Он отвечает на вопрос 2, вам решать выбрать сероватый цвет. – Berger

0
setBackground(UIManager.getColor("TextField.inactiveBackground")); 
+2

Добавьте некоторое объяснение, чтобы ответить, как эта помощь помогает вместо того, чтобы просто добавить одну строку кода. Спасибо –

+1

Хотя этот код может ответить на вопрос, было бы лучше включить какой-то контекст, объяснить, как он работает и когда его использовать. Ответы только на код не полезны в долгосрочной перспективе. – Bono

0

Для вашего первого вопроса:
Как кто-то сказал, что это выше It could have something to do with the look and feel and or the UI Defaults been installed

Что касается второго вопроса:

  1. Вы можете использовать UIManager.getColor ИЛИ
  2. Вы можете использовать Color класс для установив цвет gray для вашего текстового поля non editable. Просто используйте Color.LIGHT_GRAY или Color.GRAY или любые другие константы, которые вы хотели бы использовать.

Оба метода будут работать одинаково как в Eclipse IDE, так и в JAR-файле.

Модификация:

1) nonEditableTextField.setBackground(UIManager.getColor(Color.lightGray)); 

2) nonEditableTextField.setBackground(UIManager.getColor(Color.LIGHT_GRAY)); 

ИЛИ

nonEditableTextField.setBackground(Color.LIGHT_GRAY); 

Однако первый способ более предпочтителен, чем второй.

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