2013-06-24 478 views
5

Tôi có một JFrame mà tôi đang đặt một số JButtons vào. Một nửa JButton có mã hóa màu - tức là. Tôi biến chúng thành màu xanh lam khi sự kiện X xảy ra - và tôi sử dụng btn.setBackgroundColor (Màu). Khi tôi sử dụng setBackgroundColor, tôi có thể thấy rằng tôi nhìn những người được JButtons bình thường có bóng/màu/cái gì đó mà những người có setBackgroundColor thì không. Tôi đã cố gắng làm cho màu trong suốt đến một mức độ hạn chế, nhưng tôi vẫn nhận được một khối màu phẳng, chứ không phải là một phiên bản màu của nút tô bóng.Làm thế nào để làm cho tất cả các nút JButton trông giống nhau khi thay đổi màu nền trên một số người trong số họ chứ không phải trên những người khác?

Điều này có vẻ như nó phải là một điều khá dễ dàng để sửa chữa, nhưng nó là bugging tôi ngay bây giờ. Tôi không muốn thay đổi LAF mặc định - nó ổn. Tôi không muốn từ bỏ sự thay đổi màu sắc. Tôi muốn các nút để tất cả xuất hiện theo kiểu (từ tôi muốn sử dụng cho HTML).

Vì vậy, tôi đang thiếu thứ gì đó ngay tại đây .... nó là gì?

Edited thêm:

JFrame frame = new JFrame(); 
frame.add(new JButton("42")); 
JButton btn24 = new JButton("24"); 
btn24.setBackground(Color.red); 
frame.add(btn24); 
frame.setVisible(true); 

Trong ví dụ trên, "42" sẽ - trên máy tính Windows của tôi - cho thấy một sự thay đổi màu sắc nhẹ ở phía dưới và phía trên, tạo ra một hiệu ứng bo tròn và bóng mờ . Nút "24" sẽ hiển thị hình vuông màu đỏ. Câu hỏi của tôi là: Có cách nào để làm cho "24" hiển thị tròn/bóng/theo kiểu với màu đỏ trên đầu trang? Hay tôi cần phải đơn giản làm cho tất cả các nút hình vuông phẳng của tôi cho một sự xuất hiện thống nhất?

Cảm ơn!

+1

Đăng mã bạn đã cố thực hiện điều này và có thể là hình ảnh về ý nghĩa của bạn bằng cách "tô bóng/màu/một cái gì đó mà những người có setBackgroundColor không " –

+2

Nhìn vào câu trả lời của @ mKorbel [ở đây] (http://stackoverflow.com/questions/5751311/creating-a-custom-button-in-java-with-jbutton/5755124 # 5755124). Và sau đó bỏ phiếu cho câu trả lời của anh ấy, bởi vì nó thực sự tuyệt vời. Ngoài ra nhìn vào câu trả lời của camickr [ở đây] (http://stackoverflow.com/questions/6256483/how-to-set-the-button-color-of-a-jbutton-not-background-color?rq=1). –

+0

Tôi đang xem câu trả lời của @ mKorbel. mã kiểm tra của camickr cho thấy khá nhiều thứ giống như tôi đã thấy với setBackgroundColor với Windows và Java 7. – user2363027

Trả lời

2

Tạo một JButton tùy chỉnh và ghi đè lên các phương pháp sơn như minh họa dưới đây:

import static javax.swing.JFrame.EXIT_ON_CLOSE; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String[] args) { 
    JButton btn24 = new DepthButton("24"); 
    JButton btn25 = new DepthButton("25"); 
    btn24.setBackground(Color.red); 
    btn25.setBackground(Color.GREEN); 

    JPanel pane = new JPanel(new BorderLayout()); 
    pane.add(new JButton("42"), BorderLayout.PAGE_START); 

    pane.add(btn24, BorderLayout.PAGE_END); 
    pane.add(btn25, BorderLayout.CENTER); 

    frame.add(pane); 
    frame.pack(); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

    /** 
    * 
    * @author Romain Guy 
    */ 
    public static class DepthButton extends JButton { 

     /** Creates a new instance of DepthButton */ 
     public DepthButton(String text) { 
      super(text); 
      setContentAreaFilled(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      Graphics2D g2 = (Graphics2D) g; 

      GradientPaint p; 
      p = new GradientPaint(0, 0, new Color(0xFFFFFF), 0, getHeight(), getBackground()); 

      Paint oldPaint = g2.getPaint(); 
      g2.setPaint(p); 
      g2.fillRect(0, 0, getWidth(), getHeight()); 
      g2.setPaint(oldPaint); 

      super.paintComponent(g); 
     } 
    } 
} 

Và đây là kết quả: enter image description here

Các ví dụ là từ một cuốn sách tuyệt vời cho java swing tiên tiến: Khách hàng giàu có của Filthy https://github.com/romainguy/filthy-rich-clients/blob/master/Gradients/TwoStopsGradient/src/DepthButton.java

+1

Tôi đã thử điều đó và có vẻ như nó hoạt động trên máy tính windows của tôi.Tôi đã sử dụng getBackground thay vì màu mới (0xC8D2DE) –

+1

@SergejWerfel chỉnh sửa đẹp :) – firephil