简体   繁体   中英

JOptionPane text showing in JFrame

Okay so the JOptionPane text is showing in the JFrame window and not even my CS professor can figure out why. It is a program to simply draw 3 lines, but it has shown the JOptionPane text in the JFrame window no matter which compiler that I use. Heres my code.

import java.awt.Graphics;
import javax.swing.*;
import javax.swing.JFrame;
public class Lab5_1 extends JPanel {

    public void paintComponent( Graphics g ) {

        super.paintComponent(g);

        String ia = JOptionPane.showInputDialog ("Enter the beginning  x point of the line");
        String iab = JOptionPane.showInputDialog ("Enter the beginning y point of the line");
        String ja = JOptionPane.showInputDialog ("Enter the end  x point of the line");
        String jab = JOptionPane.showInputDialog ("Enter the end y point of the line");
        int jx = Integer.parseInt(ja);
        int jy = Integer.parseInt(jab);
        int ix = Integer.parseInt(ia);
        int iy = Integer.parseInt(iab);

        String iac = JOptionPane.showInputDialog ("Enter the beginning  x point of the line");
        String iabc = JOptionPane.showInputDialog ("Enter the beginning y point of the line");
        String jac = JOptionPane.showInputDialog ("Enter the end  x point of the line");
        String jabc = JOptionPane.showInputDialog ("Enter the end y point of the line");
        int jxb = Integer.parseInt(jac);  
        int jyb = Integer.parseInt(jabc);
        int ixb = Integer.parseInt(iac);
        int iyb = Integer.parseInt(iabc);

        String iad = JOptionPane.showInputDialog ("Enter the beginning  x point of the line");
        String iabd = JOptionPane.showInputDialog ("Enter the beginning y point of the line");
        String jad = JOptionPane.showInputDialog ("Enter the end  x point of the line");
        String jabd = JOptionPane.showInputDialog ("Enter the end y point of the line");
        int jxc = Integer.parseInt(jad);
        int jyc = Integer.parseInt(jabd);
        int ixc = Integer.parseInt(iad);
        int iyc = Integer.parseInt(iabd);

        g.drawLine(ix,iy,jx,jy);
        g.drawLine(ixb,iyb,jxb,jyb);
        g.drawLine(ixc,iyc,jxc,jyc);
    }

    public static void main( String[] args ) {
        Lab5_1 panel = new Lab5_1(); 
        JFrame application = new JFrame(); 

        application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        application.add( panel ); 
        application.setSize( 500, 290 ); 
        application.setVisible( true ); 
    }
}

Here's the result: 在此处输入图片说明

I believe this is happening because you're using JOptionPane.showInputDialog from inside of the paintComponent method. That's not really how it's intended to be done, and is going to cause you no small amount of problems.

I'd suggest pulling that part out of the paintComponent method, and instead simply setting values on the object which are referenced by paintComponent .

So your code would become something like this:

public class Lab5_1 extends JPanel {
    int ix;
    /* Rest of the fields */

    public void paintComponent( Graphics g ) {
        super.paintComponent(g);

        g.drawLine(ix,iy,jx,jy);
        /* Rest of the lines */
    }

    public static void main(String[] args){
        Lab5_1 panel = new Lab5_1();
        String ia = JOptionPane.showInputDialog ("Enter the beginning  x point of the line");
        panel.ix = Integer.parseInt(ia);

        /* Rest of your initialization code */
    }
}

This won't try to read those values every time the component wants to be repainted, and should correct the graphical glitches.

I moved the JOptionPane s out of the paintComponent method. The problem went away immediately. It has to do something with overriding that component. My bet would be the fact that you call super() in that override, but I haven't tested that hypothesis myself. The problem, whatever its cause, goes away when you move your JOptionPane s outside paintComponent .

Also, I feel it would be much easier on the user to tell the use to input coordinates, then parsing those coordinates into the jx , jy , etc. variables. Simpler and only three panes instead of six.

import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Lab5_1 extends JPanel {

    private static final long serialVersionUID = 1L;

    private static int jx;
    private static int jy;
    private static int ix;
    private static int iy;
    private static int jxb;
    private static int jyb;
    private static int ixb;
    private static int iyb;
    private static int jxc;
    private static int jyc;
    private static int ixc;
    private static int iyc;

    @Override public void paintComponent(Graphics g) {

        super.paintComponent(g);

        g.drawLine(ix, iy, jx, jy);
        g.drawLine(ixb, iyb, jxb, jyb);
        g.drawLine(ixc, iyc, jxc, jyc);

    }

    public static void main(String[] args) {
        SwingTesting panel = new SwingTesting();
        JFrame application = new JFrame();

        String ia = JOptionPane.showInputDialog("Enter the beginning  x point of the line");
        String iab = JOptionPane.showInputDialog("Enter the beginning y point of the line");
        String ja = JOptionPane.showInputDialog("Enter the end  x point of the line");
        String jab = JOptionPane.showInputDialog("Enter the end y point of the line");
        jx = Integer.parseInt(ja);
        jy = Integer.parseInt(jab);
        ix = Integer.parseInt(ia);
        iy = Integer.parseInt(iab);

        String iac = JOptionPane.showInputDialog("Enter the beginning  x point of the line");
        String iabc = JOptionPane.showInputDialog("Enter the beginning y point of the line");
        String jac = JOptionPane.showInputDialog("Enter the end  x point of the line");
        String jabc = JOptionPane.showInputDialog("Enter the end y point of the line");
        jxb = Integer.parseInt(jac);
        jyb = Integer.parseInt(jabc);
        ixb = Integer.parseInt(iac);
        iyb = Integer.parseInt(iabc);

        String iad = JOptionPane.showInputDialog("Enter the beginning  x point of the line");
        String iabd = JOptionPane.showInputDialog("Enter the beginning y point of the line");
        String jad = JOptionPane.showInputDialog("Enter the end  x point of the line");
        String jabd = JOptionPane.showInputDialog("Enter the end y point of the line");
        jxc = Integer.parseInt(jad);
        jyc = Integer.parseInt(jabd);
        ixc = Integer.parseInt(iad);
        iyc = Integer.parseInt(iabd);

        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.add(panel);
        application.setSize(500, 290);
        application.setVisible(true);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM