2013-03-17 3 views
0

Я новичок в рисовании в качелях. Я читал учебники, но я не понимаю. Я взял данные от пользователя в JDialogs и проанализировал их до целочисленных значений следующим, когда я пытаюсь провести линию, используя эти значения, ничего не происходит. Пожалуйста помоги. Кто-то сказал мне использовать оппортунистическую привязку JOGL - это так? Это код:Линия рисования в качелях через пользовательский ввод

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
class DrawingPanel extends JPanel{ 
int x0,y0,x1,y1; 
DrawingPanel(int ix,int iy,int fx,int fy){ 
    setLayout(new GridBagLayout()); 
    x0=ix; 
    y0=iy; 
    x1=fx; 
    y1=fy; 
} 
public void paintComponent(Graphics g){ 

    g.drawLine(x0,y0,x1,y1); 
} 
} 
class DDA implements ActionListener{ 
JFrame j; 
JDialog jd; 
JButton ok,can; 
JTextField ix,iy,fx,fy; 
int x0,y0,xf,yf; 
DDA(){ 
    j=new JFrame("DDA Algorithm"); 
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    j.setLocationByPlatform(true); 
    j.setLayout(new GridBagLayout()); 
    j.setExtendedState(Frame.MAXIMIZED_BOTH); 
    //j.setSize(500, 500); 
    createandrun(); 
    DrawingPanel ob=new DrawingPanel(x0,y0,xf,yf); 

    GridBagConstraints c=new GridBagConstraints(); 
    c.anchor=GridBagConstraints.PAGE_START; 
    j.add(ob,c); 
    //j.add(jd); 
    j.setResizable(false); 
    j.setVisible(true); 
    //j.pack(); 
} 
public void createandrun(){ 
JLabel lx,ly,rx,ry; 

jd=new JDialog((Frame)null,"Input Box",true); 
//jd.setSize(250, 250); 
jd.setLocationRelativeTo(j); 
jd.setLayout(new GridBagLayout()); 
GridBagConstraints c=new GridBagConstraints(); 

lx=new JLabel("X0 : "); 
ly=new JLabel("Y0 : "); 
rx=new JLabel("X1 : "); 
ry=new JLabel("Y1 : "); 
ix=new JTextField(10); 
iy=new JTextField(10); 
fx=new JTextField(10); 
fy=new JTextField(10); 
ok=new JButton("OK"); 
can=new JButton("Cancel"); 

c.anchor=GridBagConstraints.PAGE_START; 
c.insets=new Insets(5,5,0,5); 
c.gridx=c.gridy=0; 
jd.add(lx,c); 
c.gridx=1; 
jd.add(ix,c); 
c.gridx=0; 
c.gridy=1; 
jd.add(ly,c); 
c.gridx=1; 
jd.add(iy,c); 
c.gridx=0; 
c.gridy=2; 
jd.add(rx,c); 
c.gridx=1; 
jd.add(fx,c); 
c.gridx=0; 
c.gridy=3; 
jd.add(ry,c); 
c.gridx=1; 
jd.add(fy,c); 
c.gridx=0; 
c.gridy=4; 
c.insets=new Insets(10,5,5,5); 
jd.add(ok,c); 
c.gridx=1; 
//c.fill=GridBagConstraints.HORIZONTAL; 
jd.add(can,c); 
ok.addActionListener(this); 
can.addActionListener(this); 

jd.pack(); 
jd.setVisible(true); 
} 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource()==can){ 
     jd.dispose(); 
    } 
    if(e.getSource()==ok){ 
     try{ 
      x0=Integer.parseInt(ix.getText()); 
      y0=Integer.parseInt(iy.getText()); 
      xf=Integer.parseInt(fx.getText()); 
      yf=Integer.parseInt(fy.getText()); 
      } 
      catch(NumberFormatException ex){ 
       JOptionPane.showMessageDialog(ok,"Please only numbers!","Invalid Input", JOptionPane.INFORMATION_MESSAGE); 
      } 
     jd.dispose(); 
    } 
} 

public static void main(String s[]){ 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      new DDA(); 
     } 
    }); 
} 
} 

ответ

1

Ничто не отображается как GridBagConstraints для JFrame не имеют никаких fill или weight свойства, установленные таким образом, не расширять DrawingPanel по мере необходимости. Вы можете сделать:

c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 

В качестве альтернативы, вы можете просто использовать по умолчанию BorderLayout в JFrame и добавить панель таким образом:

j.add(ob); 

Side Примечание: Не забудьте позвонить super.paintComponent(g) при вызове paintComponent для окраски детских компонентов.

0

Для того, чтобы она работает, вы должны сделать некоторые конкретные действия:

Определить метод paint в вашем class DDA вместо paintComponent

public void paint(Graphics g){ 
    g.drawLine(x0, y0, x1, y1); 
} 

Перемещение экземпляра из DrawingPanel объекта ob к actionPerformedmethod в классе DDA и выполните определение макета. Одна ошибка состоит в том, что вы вызываете конструктор DrawingPanel в методе DDA конструктора, даже до нагрузки x0, y0, xf, yf, которые являются переменные, которые вы используете в качестве параметров линии, поэтому включать что-то вроде этого в конце actionPerformed метода:

DrawingPanel ob = new DrawingPanel(x0, y0, xf, yf); 
GridBagConstraints c = new GridBagConstraints(); 
c.anchor = GridBagConstraints.PAGE_START; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 
j.add(ob, c); 
j.setResizable(false); 
j.setVisible(true); 

Вызов paint метод DrawingPanel объекта в actionPerformed в DDA после перед блоком, как это:

ob.repaint(); 
Смежные вопросы