绘制直方图时如何更改矩形的大小?

dan*_*nn_ 0 java graphics user-interface swing paint

其实我是java gui的新手,在这里我想改变矩形高度每当我们把东西放在文本字段并按下按钮,但我不知道怎么做,实际上我查了一大堆但是我不能找不到简单的方法.实际上我找不到如何更改MyPanel类中paintComponent内部的矩形大小.

(高度变化的逻辑是元首和小的元音,以及字符串中的组成和其他东西)

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hist{
    int h1=0,h2=0,h3=0,h4=0,h5=0;
    JFrame f=new JFrame();
    JButton b=new JButton("click");
    JTextField text=new JTextField(30);


public static void main(String args[]){
    Hist h=new Hist();

}

Hist(){

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new FlowLayout());
    f.add(new MyPanel(h1,h2,h3,h4,h5));
    f.setSize(400,300);
    f.setVisible(true);

    f.add(b);
    f.add(text);

    thehandler handler=new thehandler();
    b.addActionListener(handler);

}
class thehandler implements ActionListener{
    public void actionPerformed(ActionEvent event){
        if(event.getSource()==b){
            h1=0;h2=0;h3=0;h4=0;h5=0;
            String s;
            s=text.getText();
            char[] ar=s.toCharArray();
            for(int i=0;i<s.length();i++){
                if(ar[i]=='a'||ar[i]=='e'||ar[i]=='i'||ar[i]=='o'||ar[i]=='u'){
                    h1=h1+10;
                }
                else if(ar[i]=='A'||ar[i]=='E'||ar[i]=='I'||ar[i]=='O'||ar[i]=='U'){
                    h2=h2+10;
                }
                else{
                    h5=h5+10;
                }
            }

        }
    }

 }
}


class MyPanel extends JPanel{
    int x1,x2,x3,x4,x5;
    public MyPanel(int a,int b,int c,int d,int e){
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        x1=a;x2=b;x3=c;x4=d;x5=e;
    }
    public Dimension getPreferredSize(){
        return new Dimension(350,200);
    }
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.red);
        g.fillRect(25, 25, 30,x1);

        g.setColor(Color.red);
        g.fillRect(75, 25, 30, x2);

        g.setColor(Color.red);
        g.fillRect(125, 25, 30,x3);

        g.setColor(Color.red);
        g.fillRect(175, 25, 30, x4);

        g.setColor(Color.red);
        g.fillRect(225, 25, 30, x5);

    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 5

"实际上我找不到如何更改paintComponent内部的矩形大小"

看起来你正在做的方式只会改变高度而不是y位置.如果它是一个颠倒的直方图,哪个会好的.

你需要做的是有一个y的起点,比如400高度的屏幕,所以地平线靠近底部

int y = 400;
Run Code Online (Sandbox Code Playgroud)

所以当你绘制它时

g.fillRect(25, y - height, 30, height)
Run Code Online (Sandbox Code Playgroud)

现在高度将是y起点,400.当你想增加它时,你实际上需要减少400.

所以如果你想要高度为150,那么你需要-150

g.fillRect(25, y - 150, 30, height);
Run Code Online (Sandbox Code Playgroud)

这将使效果从地平线上升一个柱

对于每一个g.fillRect你应该计算一个新的高度,所以你可以有一个height变量.和一个final INCREMENT基于元音数量的变量.所以这样的事情

final int INCREMENT = 25;
int height;

....

height = numberOfAs * INCREMENT;
g.fillRect(25, y - height, 30, height);
height = numberOfEs * INCREMENT;
g.fillRect(75, y - height, 30, height);
height = numberOfOs * INCREMENT;
g.fillRect(125, y - height, 30, height);
height = numberOfIs * INCREMENT;
g.fillRect(175, y - height, 30, height);
height = numberOfUs * INCREMENT;
g.fillRect(225, y - height, 30, height);
Run Code Online (Sandbox Code Playgroud)

运行此示例以查看我正在谈论的内容

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Histogram extends JPanel {

    private static final int DIM_WIDTH = 300;
    private static final int DIM_HEIGHT = 450;

    int height;
    private static final int INCREMENT = 50;
    int numberOfAs = 4;
    int numberOfEs = 2;
    int numberOfIs = 1;
    int numberOfOs = 5;
    int numberOfUs = 6;
    int y = 400;

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        height = numberOfAs * INCREMENT;
        g.fillRect(25, y - height, 30, height);
        height = numberOfEs * INCREMENT;
        g.fillRect(75, y - height, 30, height);
        height = numberOfOs * INCREMENT;
        g.fillRect(125, y - height, 30, height);
        height = numberOfIs * INCREMENT;
        g.fillRect(175, y - height, 30, height);
        height = numberOfUs * INCREMENT;
        g.fillRect(225, y - height, 30, height);
    }

    public static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.add(new Histogram());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);

    }

    public Dimension getPreferredSize() {
        return new Dimension(DIM_WIDTH, DIM_HEIGHT);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

从左到右,INCREMENT每个字母有50个像素

As = 4;
Es = 2;
Os = 5;
Is = 1;
Us = 6;
Run Code Online (Sandbox Code Playgroud)

此外,在您希望能够使用文本字段条目控制重绘的程序中,您可以settersMyPanel类中设置numberOfXs变量的值.从用于获取它们的任何方法中获取它们之后,只需调用setNumberOfAs(int numberOfAs)其余的setter,然后调用repaint.因此,每次从textField获取输入,并且您已更新变量标签时MyPanel,绘制的直方图应该更新.


UPDATE

你可以做的另一种方法是使这两个ActionListener MyPanel 内部类Hist.这样他们就可以共享全局变量了Hist.创建类的NumberOfXs变量成员,Hist以便所有内部类都可以共享.在ActionListener你们班actionPerformed,因此,改变变量repaintMyPanel.如果你这样做,你就不需要将参数传递给构造函数MyPanel


更新2

我不想为你做完整的任务,所以我会给你一个基本的大纲.

  • 制作两个类的内部类 Hist
  • numberOfXs变量类成员Hist,而不是MyPanel
  • 创建一个MyPanelin 的实例Hist作为类成员,以便它可以被接收ActionListener
  • 查看该值numberOfXs在你actionPerformed然后调用重绘

像这样的东西

public class Hist {
    MyPanel myPanel = new MyPanel();
    int numberOfAs;
    int numberOfEs;
    int numberOfIs;
    int numberOfOs;
    int numberOfUs;

    private class MyPanel extends JPanel {
        // do your painting
    }

    private class MyListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            // get the values for numberOfXs however you do it. Make sure to numberOfXs = someValue
            myPanel.repaint();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)