2013-11-10 2 views
1

У меня действительно большая проблема, когда эфир создает JLabel, Jbutton и т. Д .... он работает с точки зрения отображения на экране, однако, когда я хочу поместить их на прямоугольник, он исчезает, а прямоугольник только показывает?Нет компонентов J на ​​моей форме?

С помощью JLabel я решил использовать drawstring, но теперь я застрял в попытке включить JTextField. Я не знаю, чего мне не хватает.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.lang.*; 
import javax.swing.event.*; 

class main 
{ 
    public static void main (String Args []) 
    { 
     GUIwindow guiW = new GUIwindow(); 
    } 
} 

class GUIwindow extends JFrame 
{ 
    JPanel grid = new JPanel(); 
    JTextArea screenArea = new JTextArea("", 10, 20); 
    JScrollPane scrollBar = new JScrollPane(screenArea); 

    GUIwindow() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500,800); 
     setTitle("Title here"); 
     setLocationRelativeTo(null); 

     screenArea.setLineWrap(true); 
     screenArea.setEditable(false); 


     grid.add(scrollBar); 
     add(grid); 
     setVisible(true); 
    } 

    public void paint (Graphics g) 
    { 
     g.setColor(Color.decode("#0232ac")); 
     g.fillRoundRect(100, 50, 300, 600, 50, 50); 
     g.setColor(Color.white); 
     g.drawString("TitleonRect", 220, 80); 
    } 

} 

ответ

1

Не переопределить метод paint() из JFrame.

Переопределить метод paintComponent() элемента.

Если подкласс JPanel, вы можете переопределить его paintComponent метода:

class GridPanel extends JPanel { 
    GridPanel() { 
     super(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.decode("#0232ac")); 
     g.fillRoundRect(100, 50, 300, 600, 50, 50); 
     g.setColor(Color.white); 
     g.drawString("TitleonRect", 220, 80); 
    } 
} 
+0

Я попробовал однако теперь только текстовое поле показывает? – lecardo

+0

Да, потому что ваш фрагмент добавляет только текстовое поле, что еще вы ожидаете от него? –

+0

прямоугольник и строка не отображаются. – lecardo

0

Все это объясняется в the javadoc:

общественность недействительной краска (график г)

Краски контейнера. Это направляет краску на любые легкие компоненты, которые являются дочерними элементами этого контейнера. Если этот метод переопределен, следует вызвать super.paint (g), чтобы облегченные компоненты были правильно отображены.

0

Вы не должны использовать paint() с JFrame, потому что лучше использовать paintComponent() на JPanel затем добавить его в JFrame.

В paintComponent() позвоните по телефону super.paintComponent(), чтобы подготовить поверхность для рисования.

1

paint(Graphics g) функция является тот, который красьте компонент и его содержимое с вызовом fowllowing три функции в порядке их появления:

  • protected void paintComponent(Graphics g): это один красьте компонент, е, г .: фон
  • protected void paintBorder(Graphics g): это один рисует границу компонента
  • protected void paintChildren(Graphics g): Это один окрашивает детей компонента в нем

Итак, все, что вы рисуете с помощью переопределения функции paint(Graphics g), вы должны вызвать эти функции, а также с порядком их появления выше внутри функции paint(). Вызов super.paint(g) будет работать, потому что он вызывает функцию класса Super класса класса (JComponent) paint(), которая уже вызывает эти три функции.

Но: почему вы переопределяете эту функцию paint() только для пользовательской картины! поместите свой собственный код рисования, создав пользовательский компонент, расширяющий JComponent or JPanel, и реализуйте функцию paintComponent(), переопределив ее и не забудьте позвонить super.paintComponent().Если вам нужен этот пользовательский компонент в качестве области содержимого фрейма: просто установите эту панель frame.setContentPane(customPane);

Заканчивать A Closer Look at the Paint Mechanism

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