3

小さな質問があります。他のクラス/ファイル/メソッドからメイン クラスの JPanel を再描画するにはどうすればよいですか?

ストーリーは、フォルダー内のファイルとクラスを調べて、メソッドの説明 (注釈) を読み取ることによって自動的に生成されるメソッドのリストを含む Swing ウィンドウを持っているということです。さて、問題は、1 つのメソッドが円と線を使用して太陽を描画する必要があるクラスがある場合、どうすればそれをメイン ウィンドウに表示させることができるでしょうか?

私は周りを見回して(読んだ:グーグルで)、JPanelが便利であることを発見しましたが、名前が何であるか、いつペイントを使用するかを知らずに、別のクラスとメソッドからペイントすると...困難が生じました。

main メソッドも追加しています。それが役立つ場合は..

static int indez = 0;
    protected static JList list; 
    static boolean valitud = false;
    public static JTextArea txtala;
    public static JScrollPane scrl;
    public static JPanel pilt;
    static Map<Integer, String[]> info = new TreeMap<Integer, String[]>();
    static ArrayList<Integer> nrs = new ArrayList<Integer>();
    public static void main(String[] args){
        Iterator<Entry<Integer, String[]>> iterator;
        Entry<Integer, String[]> entry;
        Integer val = 0;

        JFrame f = new JFrame("Praktikumid");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(750, 350);

        JPanel panel = new JPanel();
        pilt = new JPanel(){public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("This is my custom Panel!", 10, 20);
        }};

        pilt.setVisible(false);
        pilt.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20));
        pilt.setBackground(Color.GRAY);

        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        ActionListener kuular = new ActionListener() {
            public void actionPerformed(ActionEvent tegu) {
                valitud = true;
                try {
                    praxStarter();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        MouseListener hiir = new MouseListener() {  
            public void mouseClicked(MouseEvent e) {
                indez = list.getSelectedIndex();
            }
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
            @Override
            public void mousePressed(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}  
        };  

        JLabel kiri = new JLabel("Vali hiirega ja vajuta nupule");

        ArrayList<String> selections = new ArrayList<String>();

        // Iterating over all the items in another method to get the modules

        list = new JList(selections.toArray());
        list.setSelectedIndex(0);
        list.addMouseListener(hiir);

        JScrollPane listScroller = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        listScroller.setMinimumSize(new Dimension(200, 50));
        listScroller.setMaximumSize(new Dimension(200, f.getHeight() * 1000));

        JButton button = new JButton("Vali");
        button.setActionCommand(Integer.toString(list.getSelectedIndex()));
        button.addActionListener(kuular);

        Font font = new Font("Arial", Font.PLAIN, 12);
        txtala = new JTextArea("<-- Vali sealt");
        txtala.setEditable(false);
        txtala.setMargin(new Insets(5, 8, 0, 0));
        txtala.setFont(font);
        scrl = new JScrollPane(txtala, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrl.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20));

        pilt.setBackground(Color.PINK);
        pilt.setVisible(false);
        pilt.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20));

        GroupLayout.ParallelGroup menu = layout.createParallelGroup();
        GroupLayout.SequentialGroup row = layout.createSequentialGroup();
        GroupLayout.SequentialGroup leftright = layout.createSequentialGroup();
        GroupLayout.ParallelGroup topdown = layout.createParallelGroup();
        GroupLayout.ParallelGroup dbl = layout.createParallelGroup();
        GroupLayout.ParallelGroup dblrow = layout.createParallelGroup();

        menu.addComponent(kiri);
        menu.addComponent(listScroller);
        menu.addComponent(button);
        leftright.addGroup(menu);
        dbl.addComponent(scrl);
        dbl.addComponent(pilt);
        leftright.addGroup(dbl);

        row.addComponent(kiri);
        row.addComponent(listScroller);
        row.addComponent(button);
        topdown.addGroup(row);
        dblrow.addComponent(scrl);
        dblrow.addComponent(pilt);
        topdown.addGroup(dblrow);

        layout.setHorizontalGroup(leftright);
        layout.setVerticalGroup(topdown);

        panel.setComponentZOrder(pilt, 1);
        panel.setComponentZOrder(scrl, 0);

        f.add(panel);
        //f.pack();
        f.setVisible(true);
    }

    public static void praxStarter()  throws Exception{
            // As a note - nrs is the holder for menu indexes
            // info is a Map of those same menu items 
            // And one entry in info is in the form of String[]{name, class.method}
        String[] tekst = new String[2];
        String kls, met;
        Method meetod;

        txtala.setText("");

        tekst = info.get(nrs.get(indez));
        kls = tekst[1].substring(0, tekst[1].indexOf("."));
        met = tekst[1].substring(tekst[1].indexOf(".") + 1, tekst[1].length());

        meetod = Class.forName(kls).getMethod(met);
        meetod.setAccessible(true);
        meetod.invoke(Class.forName(kls).newInstance());
    }

また、ここに 1 つのクラスの描画 (または描画しようとしている) の例があります。

public class brush extends Applet {
public void paint(Graphics g) {
        int x0 = 150;
        int y0 = 150;
        int r = 100;
        int x, y;
        double t;

        int w = getWidth();
        int h = getHeight();

        x0 = w / 2;
        y0 = h / 2;

        g.setColor(Color.white);
        g.fillRect(0, 0, w, h);

        g.setColor(Color.black);

        for (t = -Math.PI; t < Math.PI; t = t + Math.PI / 16) {
            x = (int) (r * Math.cos(t) + x0);
            y = (int) (r * Math.sin(t) + y0);
            g.drawLine(x0, y0, x, y);
        }
    }
}

回答とアドバイスをお寄せいただきありがとうございます。

編集: スクリーンショットは次のとおりです。 スクリーンショット

左側は、通常の画面上にテキストを印刷するモジュールです。右側は非表示のテキスト パーツであり、JPanel が表示されていpilt = new JPanel()ます。JPanel はパーツからペイントされていますが、メイン クラス以外の他の成功した編集はありません。

編集:私は複数の方法で描画しようとしましたが、表示されたソリューション検索を試してみました.

`txtala.setVisible(false);
scrl.setVisible(false);
pilt.setBorder(BorderFactory.createLineBorder(Color.BLACK));
pilt.setVisible(true);
//bi = new BufferedImage(pilt.getWidth() + 1000, pilt.getHeight() + 1000, BufferedImage.TYPE_INT_ARGB);
Graphics g = pilt.getGraphics();
g.setColor(Color.black);
g.drawLine(0, 0, 1000, 1000);
g.drawString("OLOLOLOLO!", 30, 50);
pilt.paint(g);
pilt.update(g);
//g.dispose();
//repaint();`
4

1 に答える 1

0

オーケー、だから私は簡単な方法で行きました。メイン ウィンドウで同じペインを使用する代わりに、新しいポップアップを作成し、その中にフレームを配置しました。私は知っています、それは最善の解決策ではありませんが、干し草、何もないよりはましです. ポップアップなしでそれを行う方法を見つけたら、ここに投稿します。それまで、頑張ってください!

于 2012-12-01T10:54:46.767 に答える