Почему я не могу рисовать линию на JFrame

Как показано ниже в коде, я получаю значения x и y строки из базы данных. А затем сохранить их в массиве x. После этого я пытаюсь нарисовать эту линию на рамке, но она не рисуется. Как я могу нарисовать линию на рамке?

public class TestFrame{
    static JFrame test;
    public static void main(String ar[]){
        test=new JFrame("Test");
        JButton openLine=new JButton(new AbstractAction("Open Line"){

            public void actionPerformed(ActionEvent e) {
                String lineId=JOptionPane.showInputDialog("Enter Line id");
                ImageComponent image=new ImageComponent();
                image.openLine(lineId);
            }

        });
        test.add(openLine, BorderLayout.NORTH);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(600,600);
        test.setVisible(true);

    }
    static class ImageComponent extends JComponent{
        static int[] x=new int[100];
        static ArrayList al=new ArrayList();
        public void openLine(String line_id){

                            try {

                                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                                Connection con=DriverManager.getConnection("jdbc:odbc:image");
                                Statement pstm=con.createStatement();
                                ResultSet rs=pstm.executeQuery("select * from Line where ID= '"+line_id+"'");
                                while(rs.next()){
                                    x[0]=rs.getInt(3);
                                    x[1]=rs.getInt(4);
                                    x[2]=rs.getInt(5);
                                    x[3]=rs.getInt(6);

                                    al.add(x);

                                }

                                repaint();

                            } catch (Exception ex) {
                                System.out.println("Exception : "+ex);
                            }
                }
                public Graphics2D gd;
                Line2D[] line=new Line2D[100];
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
                        gd=(Graphics2D)g;

                        gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

                            for(int i=0;i<al.size();i++){
                                line[i]=new Line2D.Double(x[0], x[1],x[2],x[3]);
                                gd.draw(line[i]);

                            }

                        }
                }
}

person Parth Soni    schedule 16.04.2012    source источник


Ответы (4)


Вот один из подходов, который использует BufferedImage в качестве поверхности рендеринга.

ОП в этом вопросе спрашивал об апплете, но я отобразил изображение на панели параметров. Он так же хорошо подходит для отображения во фрейме и т. д., не путаясь в том, следует ли переопределить paint(Graphics) или paintComponent(Graphics). ;)

person Andrew Thompson    schedule 16.04.2012
comment
Хм… замените «нарисовать линию кадра» на «нарисовать линию на изображении (и поместить ее на кадр, если хотите)», и есть рабочий (анимированный) пример. Вы пробовали запустить код? - person Andrew Thompson; 16.04.2012

Вы можете использовать объект Graphics и переопределить метод paint() следующим образом:

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

    g2.setPaint(Color.gray);
    int x = 5;
    int y = 7;

    g2.draw(new Line2D.Double(x, y, 200, 200));
    g2.drawString("Line2D", x, 250);

  }

Взято из здесь

person npinti    schedule 16.04.2012
comment
Мне нужно нарисовать линию, используя paintComponent(), так как есть некоторые другие методы, которые здесь не показаны. Итак, как я могу сделать такое? - person Parth Soni; 16.04.2012

Вы не должны прямо на JFrame. Весь рендеринг в основном теле JFrame выполняется в области содержимого. Содержимое меню выполняется в JMenuBar

person ControlAltDel    schedule 16.04.2012
comment
Есть ли другой способ, с помощью которого я могу нарисовать линию? - person Parth Soni; 16.04.2012
comment
Вы не должны прямо в JFrame В коде указано ImageComponent extends JComponent{ — OP не рисует непосредственно во фрейме. - person Andrew Thompson; 16.04.2012

Одна проблема заключается в том, что вы создаете новый ImageComponent каждый раз, когда нажимаете кнопку, но он не добавляется в ваш фрейм. Другой заключается в том, что вы заполняете массив (al), но не используете его для фактического рисования своей линии.

Это работает для меня с фиктивными значениями для x[0], x[1], x[2], x[3]:

static JFrame test;
static ImageComponent image = new ImageComponent(); //declared as a class member

public static void main(String ar[]) {
    test = new JFrame("Test");
    JButton openLine = new JButton(new AbstractAction("Open Line") {

        public void actionPerformed(ActionEvent e) {
            String lineId = JOptionPane.showInputDialog("Enter Line id");
            image.openLine(lineId);
        }
    });
    test.add(openLine, BorderLayout.NORTH);
    test.add(image); //ADD THE IMAGE TO THE FRAME
    image.setVisible(true);
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setSize(600, 600);
    test.setVisible(true);

}
person assylias    schedule 16.04.2012
comment
не могли бы вы показать весь код, который сработал для вас, я пытаюсь сделать то же самое, но у меня это не работает. - person Parth Soni; 19.04.2012