2013-05-20 3 views
8

Кто-нибудь знает, как добавить JTextField в имя Graphics bufferstrategy.getDrawGraphics? судимого боль это в графику, что-то вроде этого:Добавление текстового поля в графику в java

private JTextField Input = new JTextField(); 
BufferStrategy bs = getBufferStrategy(); 

if (bs == null) { 
    createBufferStrategy(3); 
    return; 
} 

final Graphics gCommands = bs.getDrawGraphics(); 
Graphics gCC = bs.getDrawGraphics(); 
Input.requestFocus(); 
Input.paint(gCC); 
Input.setBounds(800,250, 350,20); 
Input.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0)); 
Input.setEditable(true); 
Input.setBackground(getBackground()); 
Input.setForeground(getForeground()); 
Input.addKeyListener(key); 

Но, Eventhough он отображается, я не мог изменить его. Даже Input.setBounds(800,250, 350,20) не работал. Этот метод, написанный выше, вызывается внутри gameloop. Может кто-нибудь мне помочь?

+0

Что пошло не так? Вы получили ошибку времени выполнения? Он отобразился? – Frecklefoot

+0

Он отображается, хотя 'JTextField' не редактировался – null

+0

Является ли класс холстом? JFrame? – Tips48

ответ

11

Окраска компонента на Graphics не сделает его «живым» компонентом. Компоненты должны быть добавлены в действительный контейнер, который привязан к собственному равноправному узлу, прежде чем они станут живыми.

В настоящий момент единственное, что вы делаете, это создание «резиновой маркировки»/изображения компонента на поверхности графического контекста.

Есть несколько приемов для этого, так как процесс рисования предполагает, что компонент подключен к действительному, родному одноранговому узлу.

Во-первых, вы должны подготовить поле ...

Input.setBounds(800,250, 350,20); 
Input.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0)); 
Input.setEditable(true); 
Input.setBackground(getBackground()); 
Input.setForeground(getForeground()); 

Затем вам нужно нарисовать его. Поле не будет автоматически перекрасить, опять же, это имеет отношение к области не прикрепленной к родному партнеру ...

Input.printAll(gCC); 

Если вы хотите компонент жизни, вы будете иметь, чтобы добавить компонент контейнер. Это может быть проблематичным при использовании стратегии буфера ...

Компоненты Swing уже имеют двойной буфер.

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