มีวิธีสร้างJButton
กราฟิกปุ่มของคุณเองหรือไม่และไม่เพียง แต่สร้างภาพภายในปุ่ม
ถ้าไม่มีมีวิธีอื่นในการสร้าง custom JButton
ใน java หรือไม่?
มีวิธีสร้างJButton
กราฟิกปุ่มของคุณเองหรือไม่และไม่เพียง แต่สร้างภาพภายในปุ่ม
ถ้าไม่มีมีวิธีอื่นในการสร้าง custom JButton
ใน java หรือไม่?
คำตอบ:
เมื่อผมเป็นคนแรกที่เรียนรู้ Java เราต้องทำ Yahtzee JPanel
และผมคิดว่ามันจะเย็นจะสร้างส่วนประกอบสวิงที่กำหนดเองและภาชนะแทนเพียงการวาดภาพทุกอย่างในหนึ่ง แน่นอนว่าประโยชน์ของการขยายSwing
ส่วนประกอบคือการมีความสามารถในการเพิ่มการรองรับแป้นพิมพ์ลัดและคุณสมบัติการช่วยการเข้าถึงอื่น ๆ ที่คุณไม่สามารถทำได้เพียงแค่มีpaint()
วิธีการพิมพ์ภาพสวย ๆ อย่างไรก็ตามอาจไม่ใช่วิธีที่ดีที่สุด แต่อาจเป็นจุดเริ่มต้นที่ดีสำหรับคุณ
แก้ไข 8/6 - หากไม่ปรากฏให้เห็นจากภาพ Die แต่ละปุ่มคือปุ่มที่คุณสามารถคลิกได้ เพื่อย้ายไปDiceContainer
ด้านล่าง เมื่อดูที่ซอร์สโค้ดคุณจะเห็นว่าปุ่ม Die แต่ละปุ่มถูกวาดแบบไดนามิกตามค่าของมัน
ขั้นตอนพื้นฐานมีดังนี้
JComponent
super()
ในตัวสร้างของคุณMouseListener
ใส่สิ่งนี้ในตัวสร้าง:
enableInputMethods(true);
addMouseListener(this);
แทนที่วิธีการเหล่านี้:
public Dimension getPreferredSize()
public Dimension getMinimumSize()
public Dimension getMaximumSize()
แทนที่วิธีนี้:
public void paintComponent(Graphics g)
จำนวนพื้นที่ที่คุณต้องใช้เมื่อวาดปุ่มของคุณถูกกำหนดโดยgetPreferredSize()
สมมติgetMinimumSize()
และgetMaximumSize()
ส่งคืนค่าเดียวกัน ฉันไม่ได้ทดลองกับสิ่งนี้มากเกินไป แต่ขึ้นอยู่กับเลย์เอาต์ที่คุณใช้สำหรับ GUI ของคุณปุ่มของคุณอาจดูแตกต่างไปจากเดิมอย่างสิ้นเชิง
ใช่เป็นไปได้ ข้อดีหลักอย่างหนึ่งของการใช้ Swing คือความสะดวกในการสร้างและจัดการการควบคุมนามธรรม
ต่อไปนี้เป็นวิธีที่รวดเร็วและสกปรกในการขยายคลาส JButton ที่มีอยู่เพื่อวาดวงกลมทางด้านขวาของข้อความ
package test;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyButton extends JButton {
private static final long serialVersionUID = 1L;
private Color circleColor = Color.BLACK;
public MyButton(String label) {
super(label);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension originalSize = super.getPreferredSize();
int gap = (int) (originalSize.height * 0.2);
int x = originalSize.width + gap;
int y = gap;
int diameter = originalSize.height - (gap * 2);
g.setColor(circleColor);
g.fillOval(x, y, diameter, diameter);
}
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
size.width += size.height;
return size;
}
/*Test the button*/
public static void main(String[] args) {
MyButton button = new MyButton("Hello, World!");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(button);
frame.setVisible(true);
}
}
โปรดทราบว่าการแทนที่paintComponentทำให้เนื้อหาของปุ่มสามารถเปลี่ยนแปลงได้ แต่เส้นขอบจะถูกวาดโดยวิธีpaintBorder getPreferredSizeวิธีนอกจากนี้ยังต้องมีการจัดการเพื่อการเปลี่ยนแปลงแบบไดนามิกสนับสนุนเนื้อหา ต้องใช้ความระมัดระวังเมื่อวัดเมตริกแบบอักษรและขนาดรูปภาพ
สำหรับการสร้างการควบคุมที่คุณสามารถวางใจได้โค้ดข้างต้นไม่ใช่แนวทางที่ถูกต้อง ขนาดและสีเป็นแบบไดนามิกใน Swing และขึ้นอยู่กับรูปลักษณ์และความรู้สึกที่ใช้ แม้แต่รูปลักษณ์โลหะเริ่มต้นก็เปลี่ยนไปในเวอร์ชัน JRE มันจะดีกว่าถ้าใช้AbstractButtonและเป็นไปตามแนวทางที่กำหนดโดย Swing API จุดเริ่มต้นที่ดีคือการดูjavax.swing.LookAndFeelและjavax.swing.UIManagerชั้นเรียน
http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html
http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html
การทำความเข้าใจกายวิภาคของ LookAndFeel มีประโยชน์สำหรับการควบคุมการเขียน: การสร้างรูปลักษณ์และความรู้สึกที่กำหนดเอง
คุณสามารถลองใช้รูปลักษณ์และสัมผัสของ Synth ได้ตลอดเวลา คุณจัดเตรียมไฟล์ xml ที่ทำหน้าที่จัดเรียงสไตล์ชีทพร้อมกับรูปภาพที่คุณต้องการใช้ รหัสอาจมีลักษณะดังนี้:
try {
SynthLookAndFeel synth = new SynthLookAndFeel();
Class aClass = MainFrame.class;
InputStream stream = aClass.getResourceAsStream("\\default.xml");
if (stream == null) {
System.err.println("Missing configuration file");
System.exit(-1);
}
synth.load(stream, aClass);
UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
System.err.println("Bad configuration file");
pe.printStackTrace();
System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
System.err.println("Old JRE in use. Get a new one");
System.exit(-3);
}
จากนั้นไปต่อและเพิ่มปุ่ม JB ของคุณตามปกติ การเปลี่ยนแปลงเพียงอย่างเดียวคือคุณใช้เมธอด setName (สตริง) เพื่อระบุสิ่งที่ปุ่มควรแมปในไฟล์ xml
ไฟล์ xml อาจมีลักษณะดังนี้:
<synth>
<style id="button">
<font name="DIALOG" size="12" style="BOLD"/>
<state value="MOUSE_OVER">
<imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
<insets top="2" botton="2" right="2" left="2"/>
</state>
<state value="ENABLED">
<imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
<insets top="2" botton="2" right="2" left="2"/>
</state>
</style>
<bind style="button" type="name" key="dirt"/>
</synth>
องค์ประกอบการผูกจะระบุสิ่งที่จะแมป (ในตัวอย่างนี้จะใช้รูปแบบนั้นกับปุ่มใด ๆ ที่มีการตั้งค่าคุณสมบัติชื่อเป็น "สิ่งสกปรก")
และลิงก์ที่มีประโยชน์สองสามลิงก์:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html
ฉันอาจจะไปผิดทางเป็นล้านไมล์ (แต่ฉันยังเด็กเท่านั้น: P) แต่คุณไม่สามารถเพิ่มกราฟิกลงในพาเนลจากนั้นจึงเพิ่มมูสลิสเตนเนอร์ให้กับออบเจ็กต์กราฟิกเพื่อที่ว่าเมื่อผู้ใช้บนกราฟิกการกระทำของคุณถูกกำหนดไว้ล่วงหน้า
ฉันไม่ได้พัฒนา SWING ตั้งแต่ชั้นเรียน CS แรก ๆ แต่ถ้ามันไม่ได้สร้างขึ้นมาคุณก็สามารถสืบทอดjavax.swing.AbstractButton
และสร้างของคุณเองได้ ควรจะค่อนข้างง่ายที่จะเชื่อมโยงบางสิ่งเข้ากับกรอบงานที่มีอยู่