パネルを拡張するクラスとフレームを拡張するクラスの 2 つのクラスがあります。
ファーストクラス、パネル(描画に使用):
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GraficPne extends JPanel{
public int dim1 = 0, dim2 = 0;
public JLabel lblSem1GraficPne, lblSem2GraficPne;
public GraficPne(){
super();
this.setLayout(null);
this.setupComponents();
}
public void setupComponents(){
lblSem1GraficPne = new JLabel("Sem I");
lblSem2GraficPne = new JLabel("Sem II");
lblSem1GraficPne.setFont(new Font("Serif", Font.PLAIN, 12));
lblSem2GraficPne.setFont(new Font("Serif", Font.PLAIN, 12));
this.add(lblSem1GraficPne);
this.add(lblSem2GraficPne);
}
public void layComponents(int firstConv, int secondConv){
lblSem1GraficPne.setBounds(20, getHeight() - firstConv - 20, 100, 20);
lblSem2GraficPne.setBounds(100, getHeight() - secondConv - 20, 100, 20);
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.BLACK);
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
this.setBackground(Color.GREEN);
g.setColor(Color.RED);
g.fillRect(20, getHeight()-dim1, 40, dim1);
g.setColor(Color.BLUE);
g.fillRect(100, getHeight()-dim2, 40, dim2);
}
public void setData(int dim1, int dim2){
this.dim1 = dim1;
this.dim2 = dim2;
}
}
2 番目のクラスであるフレームは、パネルを追加するために使用されます。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class GraficFrm extends JFrame implements ActionListener{
private JButton btnApply;
private JLabel lblSem1, lblSem2;
private JTextField txtSem1, txtSem2;
private GraficPne ob; //the object from first class
private int firstConv = 0, secondConv = 0;
public GraficFrm() {
super("Grafic soft");
initSettings();
setupComponents();
}
private void initSettings() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.setSize(400, 450);
this.setLocation(100, 100);
this.setResizable(false);
}
private void setupComponents() {
ob = new GraficPne();
lblSem1 = new JLabel("Sem I");
txtSem1 = new JTextField();
lblSem2 = new JLabel("Sem II");
txtSem2 = new JTextField();
btnApply = new JButton("Apply");
ob.setBounds(30, 50, 340, 200);
lblSem1.setBounds(30, 280, 100, 20);
txtSem1.setBounds(150, 280, 220, 20);
lblSem2.setBounds(30, 330, 100, 20);
txtSem2.setBounds(150, 330, 220, 20);
btnApply.setBounds(170, 380, 80, 30);
this.add(lblSem1);
this.add(ob);
this.add(txtSem1);
this.add(lblSem2);
this.add(txtSem2);
this.add(btnApply);
btnApply.addActionListener(this);
}
public void getConvertedValues(){
String txtField1 = txtSem1.getText();
firstConv = Integer.parseInt(txtField1);
String txtField2 = txtSem2.getText();
secondConv = Integer.parseInt(txtField2);
}
public void getHighValues(){
if((firstConv > 100) || (secondConv > 100)) {
JOptionPane.showMessageDialog(this, "Only values < 100 are allowed");
firstConv = 0;
secondConv = 0;
txtSem1.setText("");
txtSem2.setText("");
ob.removeAll();
ob.repaint();
}
}
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(btnApply)){
try{
new GraficFrm();
getConvertedValues();
getHighValues();
ob.setData(firstConv, secondConv);
ob.layComponents(firstConv,secondConv);
ob.repaint();
}catch(NumberFormatException ex1){
JOptionPane.showMessageDialog(this, "Only natural numbers are allowed");
}
}
}
public static void main(String[] args) {
GraficFrm frm = new GraficFrm();
frm.setVisible(true);
}
}
やりたいことは、getNegativeValues() という新しいメソッドを作成することだけです。このメソッドは、適用ボタンを押すことで呼び出されます。このメソッドは、firstConv または secondConv が 0 未満のときに実行されます。メソッドのブロック getNegativeValues( )、ペイント(Graphics g)のようにパネルの緑の背景のみを保持したいが、中央の水平線を描画する(g.drawLine(0、getHeight()/ 2、getWidth()、getHeight() )/2);)。次に、プログラムを実行して入力すると、最初のテキストフィールドに値 55、2 番目のテキストフィールドに -40 を指定して、中央の水平線の上に 55 を描画し、中央の水平線の下に -40 を描画すると、0 ポイントがこの中央の水平線上にあります。
LE: @nIcE cOw 簡単にまとめます: まず、アプリを実行すると、私の例のように、緑色のパネルと 2 つのテキスト フィールドを持つ 2 つのラベルが表示されます (私の例に従ってみてください)。 、お願いします)(大丈夫です。私はすでにこれを行っているので、この部分は完了しています)。その後、これらの2つのテキストフィールドを完了すると、2つの正の値で言いましょう。次に、[適用]ボタンを押すと、私の例とまったく同じように発生します(中央の垂直線なし)(すでにこれも行っています)。すべて問題ありませんが、私の問題は次のとおりです。これらの2つのテキストフィールドの1つを負の値で完了し、他のテキストフィールドを正の値で完了し、[適用]ボタンを押した後、1つに入力された負の値があることをアプリケーションに認識させたい私のテキストフィールドの したがって、緑色のパネルに中央の水平線を描き([適用]ボタンを押した後)、最初にアップロードした写真とまったく同じように2つの長方形を描きます。私がやりたいことを理解するのを手伝うと言ったように、私を助けてください。また、あなたの努力に本当に感謝しています。