2015-04-10 10 views
0

У меня ужасное время, пытаясь отобразить треугольники, которые я пытаюсь нарисовать. Я просмотрел веб-страницы, и многие из вариантов, которые я нашел, я реализовал, которые не исправили мою проблему с отображением. Моя панель кнопок отображается отлично, но мой JPanel для рисования либо не используется, либо не нарисован. Любая помощь, которую вы, ребята, можете дать, была бы замечательной. Я смотрел на несколько дней и не имел никакой удачи. У меня больше кода для реализации, но я хочу, чтобы мои кодовые коды работали до того, как я добавлю слишком много. Вот мой код благодарит за любую помощь раньше времени.paintComponent проблемы с отображением

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.geom.Point2D; 

import javax.swing.*; 

public class RotateAndShiftTriangles extends JPanel{ 

int rWidth, rHeight, centerX, centerY, prevMove = -1, maxX, maxY; 
float pixelSize; 
double radians; 
static Point2D pA, pB, pC; 

//Default constructor 
RotateAndShiftTriangles(){ 
    rWidth = Integer.parseInt(JOptionPane.showInputDialog("Enter the rWidth of the panel: ")); 
    rHeight = Integer.parseInt(JOptionPane.showInputDialog("Enter the rHeight of the panel: ")); 
} 

// main method of the program that all it really does is call the create method 
public static void main(String [] argv){ 
    RotateAndShiftTriangles tri = new RotateAndShiftTriangles(); 
    tri.create(); 
} 

public void create(){ 
    // Initializing graphics 
    JFrame win = new JFrame(); 
    Dimension d = new Dimension(800, 600); 
    maxX = d.width - 1; 
    maxY = d.height - 1; 
    pixelSize = Math.max(rWidth/maxX, rHeight/maxY); 
    centerX = maxX/2; centerY = maxY/2; 
    win.setSize(d); 
    win.setMinimumSize(d); 
    win.setPreferredSize(d); 
    win.getContentPane().setLayout(new BorderLayout()); 
    Point2D centerPoint = new Point2D.Double(centerX, centerY); 
    JPanel draw = new JPanel(); 
    JPanel buttonPanel = new JPanel(); 
    JButton shiftButton = new JButton("Shift"); 
    JButton rotateButton = new JButton("Rotate"); 
    JButton shiftandRotateButton = new JButton("Shift and Rotate"); 
    JButton resetButton = new JButton("Reset"); 
    JButton backButton = new JButton("Back"); 

    // setting layout 
    win.add(this); 
    win.add(draw, BorderLayout.CENTER); 
    buttonPanel.add(shiftButton); 
    buttonPanel.add(rotateButton); 
    buttonPanel.add(shiftandRotateButton); 
    buttonPanel.add(resetButton); 
    buttonPanel.add(backButton); 
    win.add(buttonPanel, BorderLayout.SOUTH); 
    win.pack(); 
    win.setLocationRelativeTo(win.getParent()); 

    // makes window visible and sets the default closing operations 
    win.setVisible(true); 
    win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
} 

// Page 19 mappings to take the logical coords and change them to ints. 
int iX(float x){ 
    return Math.round(centerX + x/pixelSize); 
    } 
int iY(float y){ 
    return Math.round(centerY - y/pixelSize); 
    } 

// Standard paintComponent method 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.blue); 
    g.drawRect(0, 0, maxX, maxY); 
    float side = 0.95F * pixelSize, sideHalf = 0.5F * side, 
     h = sideHalf * (float)Math.sqrt(3), xA, yA, xB, yB, xC, yC, xA1, yA1, xB1, yB1, xC1, yC1, p, q; 
    q = 0.05F; 
    p = 1 - q; 
    xA = centerX - sideHalf; 
    yA = centerY - 0.5F * h; 
    xB = centerX + sideHalf; 
    yB = yA; 
    xC = centerX; 
    yC = centerY + 0.5F * h; 
    pA.setLocation(xA, yA); 
    pB.setLocation(xB, yB); 
    pC.setLocation(xC, yC); 

    for (int i=0; i<50; i++) 
    { 
     g.drawLine(iX(xA), iY(yA), iX(xB), iY(yB)); 
     g.drawLine(iX(xB), iY(yB), iX(xC), iY(yC)); 
     g.drawLine(iX(xC), iY(yC), iX(xA), iY(yA)); 
     xA1 = p * xA + q * xB; 
     yA1 = p * yA + q * yB; 
     xB1 = p * xB + q * xC; 
     yB1 = p * yB + q * yC; 
     xC1 = p * xC + q * xA; 
     yC1 = p * yC + q * yA; 
     xA = xA1; xB = xB1; xC = xC1; 
     yA = yA1; yB = yB1; yC = yC1; 
    } 
} 

}

ответ

1
win.add(this); 
win.add(draw, BorderLayout.CENTER); 

Вы добавляете свой треугольник панель к окну. Если вы не укажете ограничение, оно будет по умолчанию BorderLayout.CENTER.

Затем вы добавляете компонент «ничья», который заменяет вашу панель, поскольку только один компонент может быть добавлен в «ЦЕНТР».

Попробуйте добавить свою треугольную панель в BorderLayout.NORTH. Однако, когда вы это сделаете, вам также необходимо переопределить метод вашей треугольной панели getPreferredSize(), в противном случае предпочтительный размер будет (0, 0), и рисовать нечего.

Для получения дополнительной информации и примеров, читайте этот раздел из учебника Swing по телефону Custom Painting.

Edit:

Принимая второй взгляд на ваш код, я даже не знаю, почему вы создали панель «рисовать». Вы не добавляете к нему никаких компонентов. Поэтому просто избавитесь от панели «draw» и пусть ваша панель «треугольник» отображается в BordeLayout.CENTER, но вам все равно нужно реализовать метод getPreferredSize(), иначе метод pack() будет игнорировать панель «треугольник».

+0

Хмм, когда я вынул win.add (это), это ничего не меняет. но когда я вынимаю другую строку, я получаю исключение пучка или нулевого указателя. мы должны сделать рисунок на Jpanel, который добавлен в JFrame. Извините, если я должен был сделать это ясно в исходном вопросе. – jnics23

+0

@ jnics23, конечно, ничего не меняет. Ничего не отобразится, если вы не добавите компонент в фрейм. Однако это не было моим предложением. – camickr

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