2014-12-13 1 views
1

Я пытаюсь добавить границу в элемент Rectangle, и по какой-то причине она не будет работать, не совместима ли она с JFrame? Я могу установить весь мой JFrame на наличие границы, но он не может найти setBorder с моими прямоугольниками. Вот мой код:Как добавить границу к прямоугольнику в Java с помощью setBorder и JFrame

package trivia; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.border.Border; 

@SuppressWarnings("serial") 
public class Main extends JFrame{ 

boolean mainMenu = true; 
static Color tan = Color.decode("#F4EBC3"); 
static Color darkGreen = Color.decode("#668284"); 
static Color buttonColor = Color.decode("#A2896B"); 
Rectangle header = new Rectangle(0, 0, 500, 100); 
Rectangle body = new Rectangle(0, 100, 500, 400); 
Rectangle start = new Rectangle(150, 150, 200, 40); 

public Main() { 
    setTitle("Trivia Game!"); 
    setSize(500, 500); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
} 
@Override 
public void paint(Graphics g) { 
    Dimension d = this.getSize(); 
    Border blackline; 

    blackline = BorderFactory.createLineBorder(Color.black); 
    if(mainMenu = true){ 
     g.setColor(darkGreen); 
     g.fillRect(header.x, header.y, header.width, header.height); 
     g.setFont(new Font("Courier", Font.BOLD, 24)); 
     g.setColor(Color.BLACK); 
     drawCenteredString("Trivia Game!", d.width, 125, g); 
     g.setColor(tan); 
     g.fillRect(body.x, body.y, body.width, body.height); 
     g.setColor(buttonColor); 
     g.fillRect(start.x, start.y, start.width, start.height); 


    } 
} 
public void drawCenteredString(String s, int w, int h, Graphics g) { 
    FontMetrics fm = g.getFontMetrics(); 
    int x = (w - fm.stringWidth(s))/2; 
    int y = (fm.getAscent() + (h- (fm.getAscent() + fm.getDescent()))/2); 
    g.drawString(s, x, y); 
} 

public static void main(String[] args) { 
    @SuppressWarnings("unused") 
    Main m = new Main(); 
} 

} 

И когда я добавляю это в моей paint функции:

start.setBorder(blackline); 

Это дает мне ошибку:

Я не знаю, как я могу сделать он признает функцию setBorder, может ли кто-нибудь помочь? Вся помощь очень ценится!

ответ

2

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

g.drawRect(start.x, start.y, start.width, start.height); 
+0

После создания прямоугольника, как бы добавить границу? просто используя 'g.setBorder();' или что? – Geroy290

+0

О, я вижу, метод 'drawRect' фактически создает границу вокруг него, спасибо! – Geroy290

3
  1. Rectangle не имеет метод setBorder, вместо этого, установите цвет Graphics контекста с помощью Graphics#setColor(Color) и использовать либо Graphics#drawRect(int, int, int, int) или Graphics2D#draw(Shape)
  2. Вы нарушаете краски цепь. Картина состоит из серии вызовов цепочечных методов, которые при правильном вызове рисуют текущий компонент и его дочерние компоненты. Не звонив super.paint, вы не можете этого сделать и можете вызвать любое количество неприятных побочных эффектов, ни одного из которых вы действительно не хотите ...
  3. Вам следует избегать переопределения paint контейнеров верхнего уровня, таких как JFrame, для ряда причины; они не дублируются буфером; там есть куча других компонентов, сидящих поверх рамы, которые могут ее нарисовать; и т.д. Вместо этого создайте пользовательский компонент, простираясь от чего-то, как JPanel и переопределить это paintComponent метод вместо (гарантируя, что вы звоните super.paintComponent первым) ...

См Painting in AWT and Swing, Performing Custom Painting и 2D Graphics для получения более подробной информации

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

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