Как произвести Строку на нескольких строках с помощью Графики

Вам придется переопределить эти методы в вашем LoginController, просто вставьте это и измените соответствующим образом.

Измените имя поля по умолчанию email на cpf:

public function username()
{
    return 'cpf'; // or whatever field you use to login
}

Выполните здесь проверку с учетными данными:

protected function validateLogin(Request $request)
{
    $request->validate([
        $this->username() => 'required|string|exists:users,cpf',
    ]);
}

Выполните запрос на вход. Здесь мы ищем пользователя, затем регистрируем его вручную и перенаправляем на панель управления (домой), если это не удается, вы будете перенаправлены обратно со входом, который был вставлен в форму:

public function login(Request $request)
{
    $this->validateLogin($request);

    $user = User::where('cpf', $request->cpf)->first();

    if ($user) {
        Auth::login($user);
        return redirect()->intended('home');
    }

    return redirect()->back()->withInput($request->all());
}

[1111 ] Таблица БД, с которой я тестировал:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('cpf')->unique();
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->rememberToken();
    $table->timestamps();
});
11
задан Burkhard 27 October 2008 в 10:42
поделиться

4 ответа

Благодаря подсказке Epaga и нескольким примерам в Сети (не настолько очевидный для нахождения! Я использовал главным образом Повреждение Строка для текстового расположения), я мог сделать компонент для отображения перенесенного текста. Это неполно, но по крайней мере это показывает намеченный эффект.

class TextContainer extends JPanel
{
    private int m_width;
    private int m_height;
    private String m_text;
    private AttributedCharacterIterator m_iterator;
    private int m_start;
    private int m_end;

    public TextContainer(String text, int width, int height)
    {
        m_text = text;
        m_width = width;
        m_height = height;

        AttributedString styledText = new AttributedString(text);
        m_iterator = styledText.getIterator();
        m_start = m_iterator.getBeginIndex();
        m_end = m_iterator.getEndIndex();
    }

    public String getText()
    {
        return m_text;
    }

    public Dimension getPreferredSize()
    {
        return new Dimension(m_width, m_height);
    }

    public void paint(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        FontRenderContext frc = g2.getFontRenderContext();

        LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
        measurer.setPosition(m_start);

        float x = 0, y = 0;
        while (measurer.getPosition() < m_end)
        {
            TextLayout layout = measurer.nextLayout(m_width);

            y += layout.getAscent();
            float dx = layout.isLeftToRight() ?
                    0 : m_width - layout.getAdvance();

            layout.draw(g2, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }
    }
}

Только для забавы, я сделал его соответствующий кругу (увы, никакое выравнивание, это кажется):

public void paint(Graphics g)
{
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;
    FontRenderContext frc = g2.getFontRenderContext();

    LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
    measurer.setPosition(m_start);

    float y = 0;
    while (measurer.getPosition() < m_end)
    {
        double ix = Math.sqrt((m_width / 2 - y) * y);
        float x = m_width / 2.0F - (float) ix;
        int width = (int) ix * 2;

        TextLayout layout = measurer.nextLayout(width);

        y += layout.getAscent();
        float dx = layout.isLeftToRight() ?
                0 : width - layout.getAdvance();

        layout.draw(g2, x + dx, y);
        y += layout.getDescent() + layout.getLeading();
    }
}

Я не слишком уверен в дуплексном вычислении, все же.

9
ответ дан 3 December 2019 в 08:31
поделиться

java.awt.font. TextLayout мог бы быть полезным. Вот отрывок их примера кода:

   Graphics2D g = ...;
   Point2D loc = ...;
   Font font = Font.getFont("Helvetica-bold-italic");
   FontRenderContext frc = g.getFontRenderContext();
   TextLayout layout = new TextLayout("This is a string", font, frc);
   layout.draw(g, (float)loc.getX(), (float)loc.getY());

   Rectangle2D bounds = layout.getBounds();
   bounds.setRect(bounds.getX()+loc.getX(),
                  bounds.getY()+loc.getY(),
                  bounds.getWidth(),
                  bounds.getHeight());
   g.draw(bounds);

Иначе Вы могли всегда использовать текстовый элемент Swing, чтобы сделать задание для Вас, просто передать в Графике, в которую Вы хотите, чтобы оно нарисовало.

3
ответ дан 3 December 2019 в 08:31
поделиться

Можно использовать JLabel и встроить текст с HTML.

JLabel.setText("<html>"+line1+"<br>"+line2);
0
ответ дан 3 December 2019 в 08:31
поделиться

Инкрементно создайте свою строку, одно слово за один раз, с помощью метода Epaga для нахождения длины строки. После того как длина дольше, чем Ваш прямоугольник, удалите последнее слово и печать. Повторитесь, пока у Вас не закончатся слова.

Это походит на плохой алгоритм, но для каждой строки, это действительно O (screenWidth/averageCharacterWidth) => O (1).

Однако, используйте StringBuffer для создания строки!

1
ответ дан 3 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: