2014-09-25 18 views
5

Đầu tiên, tôi là một nhà phát triển Web và một lập trình viên Java mới làm quen. ông chủ của tôi đang yêu cầu tôi làm cho nút này trong một ứng dụng:Cách tạo JButton tròn trong Java

enter image description here

nút lớp tùy chỉnh của tôi phải mở rộng JButton hoặc BasicButtonUI để nó có thể được tái sử dụng.

Tôi đã thực hiện một số nghiên cứu về Stack Overflow, nhưng tôi không hiểu câu trả lời, đặc biệt là với các hạn chế về thời gian từ sếp của tôi.

+7

http://java-swing-tips.blogspot.com/2008/11/rounded-corner-jbutton.html –

+2

'Đầu tiên, tôi Web Developer' - với nghiên cứu nghèo trước đây, không có ý tưởng whos upvoted câu hỏi này, không có yêu cầu bất kỳ đồ họa, chỉ biên giới và ghi đè các sự kiện từ ButtonModel – mKorbel

+0

Những gì ... những người upvoted này? : D Bạn có chắc chắn có [không có gì ở đây cho bạn ??] (http://stackoverflow.com/search?q=round+jbutton) Hãy nhớ rằng StackOverflow không phải là một nơi để hoàn thành công việc của bạn cho bạn. Vui lòng cung cấp một phác thảo về những gì bạn đã thử cho đến nay và nơi bạn đang mắc kẹt. Ngoài ra, hãy cố gắng cung cấp lý do tại sao bạn muốn mở rộng JButton và không được thúc đẩy, mọi thứ không được thực hiện vội vàng tại đây – avalancha

Trả lời

13

Bạn nên tạo thành phần của riêng mình cho việc này.

Override các paintComponent phương pháp trên một JPanel, và bên trong phương pháp bốc thăm paintComponent (ví dụ điền vào) một rectangle2D tròn trong màu xám màu:.

RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(x, y, w, h, 10, 10); 
g.fill(roundedRectangle); 

(Hai giá trị cuối cùng xác định độ cong Chơi xung quanh cho đến khi bạn có được những gì bạn muốn)

Bây giờ di chuyển x, y và giảm rộngchiều cao để khi bạn vẽ ne hình chữ nhật xt, nó nằm bên trong hình chữ nhật màu xám. Đặt màu đồ họa thành màu xanh lam, sau đó thực hiện như sau:

RoundRectangle2D roundedRectangle2 = new RoundRectangle2D.Float(x + 5, y + 5, w - 10, h - 10, 10, 10); 
g.fill(roundedRectangle2); 

Bạn cũng sẽ cần phải thêm văn bản. Thêm văn bản yêu cầu vị trí x và y. Vị trí x và y chính xác có thể phức tạp để tính toán, vì vậy bạn có thể cần phải sử dụng FontMetrics để nhận thêm một số thông tin về hình dạng hình chữ nhật của chuỗi. Fontmetrics có các phương thức như stringWidth() và getHeight() sẽ giúp bạn xác định x và y của bạn là gì.

g.drawString("Click Me", x, y); 

Cuối cùng, bạn cần có người nghe chuyển động trên bảng điều khiển. Trình nghe cần tìm khi con trỏ qua nút và sau đó vẽ lại thành phần.

Hình chữ nhật của bạn có thể được đúc thành đối tượng shape và có thể tính toán xem liệu chuột có trong hình dạng hay không. Ví dụ:

shape.contains(x,y) 

Nếu nó chứa, thay đổi màu sắc, sau đó gọi repaint() hoặc updateUI() trên bảng điều khiển.

Lưu ý: đối tượng màu màu phải được giữ như một trường cấp lớp trong lớp để có thể thay đổi thông qua di chuột qua.

Hy vọng điều này sẽ hữu ích!

+0

Ok hãy để tôi thử –

+0

có nhiều thứ tôi có thể thêm vào. Nhưng hãy cho tôi biết nếu điều đó không đủ trong câu trả lời của tôi. –

+0

Xin vui lòng cho tôi biết những thứ khác là những gì có thể được tôi có thể làm cho nó tốt hơn. Cảm ơn –

2

Có nhiều cách để thực hiện.

1) JButton có setIcon API sẵn có. Bạn có thể đặt ImageIcon ở đây.

2) Bạn có thể thêm trình nghe chuột (Chuột đã nhập, Chuột đã thoát) thay đổi biểu tượng cho những người cần thiết.

3) Make a button round - Tham khảo để tạo các nút cong.

+0

+1 cho liên kết để sửa mã trong biểu mẫu SSCCE/MCVE – mKorbel

4

Nếu bạn không muốn tự mình vẽ hình ảnh bằng cách sử dụng API đồ họa hoặc bạn không thể sử dụng hình ảnh từ nhà thiết kế đồ họa, bạn có thể sử dụng chúng làm đối tượng ImageIcon và sử dụng setRolloverIcon()setIcon().

Trong trường hợp này tôi sẽ làm điều đó theo cách này

class ButtonRollover { 

    private String normalImagePath; 
    private String rolloverImagePath; 

    public ButtonRollover(String normalImagePath, String rolloverImagePath) { 
     this.normalImagePath = normalImagePath; 
     this.rolloverImagePath = rolloverImagePath; 
    } 

    public void apply(AbstractButton abstractButton) { 
     abstractButton.setBorderPainted(false); 
     abstractButton.setBackground(new Color(0, 0, 0, 0)); 
     abstractButton.setRolloverIcon(createImageIcon(rolloverImagePath)); 
     abstractButton.setIcon(createImageIcon(normalImagePath)); 
    } 

    private ImageIcon createImageIcon(String path) { 
     java.net.URL imgURL = getClass().getResource(path); 
     if (imgURL != null) { 
      return new ImageIcon(imgURL); 
     } else { 
      System.err.println("Couldn't find file: " + path); 
      return null; 
     } 
    } 
} 

và hơn sử dụng nó. Ví dụ.

public class Main extends JFrame { 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.setBackground(Color.WHITE); 
     main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     main.setSize(640, 480); 

     Container contentPane = main.getContentPane(); 

     ButtonRollover buttonRollover = new ButtonRollover("/bt_normal.png", 
       "/bt_hover.png"); 

     JButton btn = new JButton(); 
     buttonRollover.apply(btn); 

     contentPane.add(btn); 
     main.setVisible(true); 
    } 
} 

Chỉ cần đặt các tệp hình ảnh trong đường dẫn lớp.

0
public class Main extends JFrame { 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.setBackground(Color.WHITE); 
     main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     main.setSize(640, 480); 

     Container contentPane = main.getContentPane(); 

     ButtonRollover buttonRollover = new ButtonRollover("/bt_normal.png", 
       "/bt_hover.png"); 

     JButton btn = new JButton(); 
     buttonRollover.apply(btn); 

     contentPane.add(btn); 
     main.setVisible(true); 
    } 
}